?? 形態(tài)學(xué)基本運(yùn)算之c語言模擬.txt
字號:
形態(tài)學(xué)基本運(yùn)算之C語言模擬[原創(chuàng)]
形態(tài)學(xué)原是對于動植物調(diào)查時采取的某種形式的研究。數(shù)學(xué)形態(tài)學(xué)是分析機(jī)和形狀和結(jié)構(gòu)的數(shù)學(xué)方法,它建立在集合代數(shù)的基礎(chǔ)上,是用集合論方法定量描述集合結(jié)構(gòu)的學(xué)科。
形態(tài)學(xué)的基礎(chǔ)是集合論。其基本的運(yùn)算子主要有腐蝕、膨脹、開、閉等。所謂膨脹一般指將與物體邊界接觸的背景像素合并到物體中的過程;簡單的腐蝕運(yùn)算將一個物體沿邊界減少一個像素。先進(jìn)行腐蝕運(yùn)算再進(jìn)行膨脹運(yùn)算稱作開運(yùn)算;先膨脹再腐蝕稱作閉運(yùn)算。
利用開運(yùn)算可以把只有少量像素相連的物體分離開,利用閉運(yùn)算則可以填補(bǔ)物體中小的空洞。
下面的代碼簡單模擬了幾個簡單的形態(tài)學(xué)基本運(yùn)算,不一定準(zhǔn)確,歡迎同行專家給出批評意見。
#define M 15
#define N 15
void shousuo(int s[M][N])
{
int i,j;
int t[M][N];
for(i=0;i<M;i++)/*備份原數(shù)據(jù)*/
for(j=0;j<N;j++)
t[i][j]=s[i][j];
for(i=1;i<M-1;i++)/*處理內(nèi)部元素*/
for(j=1;j<N-1;j++)
if(t[i][j-1]==0||t[i][j+1]==0||t[i-1][j]==0||t[i+1][j]==0)
s[i][j]=0;
for(i=1;i<M-1;i++)
{/*處理邊界元素*/
if(t[i-1][0]==0||t[i+1][0]==0)
s[i][0]=0;
if(t[i-1][N-1]==0||t[i+1][N-1]==0)
s[i][N-1]=0;
}
for(j=0;j<N-1;j++)
{/*處理邊界元素*/
if(t[0][j-1]==0||t[0][j+1]==0)
s[0][j]=0;
if(t[M-1][j-1]==0||t[M-1][j+1]==0)
s[M-1][j]=0;
}
if(t[0][1]==0||t[1][0]==0)/*以下幾條語句處理四個角的元素*/
s[0][0]=0;
if(t[0][N-2]==0||t[1][N-1]==0)
s[0][N-1]=0;
if(t[M-2][0]==0||t[M-1][1]==0)
s[M-1][0]=0;
if(t[M-2][N-1]==0||t[M-1][N-2]==0)
s[M-1][N-1]=0;
}
void pengzhang(int s[M][N])
{
int i,j;
int t[M][N];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
t[i][j]=s[i][j];
for(i=1;i<M-1;i++)
for(j=1;j<N-1;j++)
if(t[i][j-1]==1||t[i][j+1]==1||t[i-1][j]==1||t[i+1][j]==1)
s[i][j]=1;
for(i=1;i<M-1;i++)
{
if(t[i-1][0]==1||t[i+1][0]==1)
s[i][0]=1;
if(t[i-1][N-1]==1||t[i+1][N-1]==1)
s[i][N-1]=1;
}
for(j=0;j<N-1;j++)
{
if(t[0][j-1]==1||t[0][j+1]==1)
s[0][j]=1;
if(t[M-1][j-1]==1||t[M-1][j+1]==1)
s[M-1][j]=1;
}
if(t[0][1]==1||t[1][0]==1)
s[0][0]=1;
if(t[0][N-2]==1||t[1][N-1]==1)
s[0][N-1]=1;
if(t[M-2][0]==1||t[M-1][1]==1)
s[M-1][0]=1;
if(t[M-2][N-1]==1||t[M-1][N-2]==1)
s[M-1][N-1]=1;
}
void output(int array[M][N])
{
int i,j;
for(i=0;i<M;i++)
{
printf("\n");
for(j=0;j<N;j++)
if(array[i][j]==1)
printf("%2d",array[i][j]);
else
printf(" ");
}
}
void main()
{
int data[M][N]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*實(shí)驗(yàn)數(shù)據(jù)*/
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
{0,0,1,1,1,1,1,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,1,1,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,0,0,0},
{0,0,0,0,0,0,0,1,1,1,1,1,0,0,0},
{0,0,0,0,0,0,0,1,1,0,1,1,0,0,0},
{0,0,0,0,0,0,0,1,1,0,1,1,0,0,0},
{0,0,1,1,1,0,0,1,1,1,1,1,0,0,0},
{0,1,1,1,1,1,1,1,1,1,1,0,0,0,0},
{0,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
int data1[M][N];
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
data1[i][j]=data[i][j];
printf("\ndata:\n");
printf("\nThe original data is:\n");
output(data);
shousuo(data);
printf("\nAfter shousuo operation.\n");
output(data);
pengzhang(data);
printf("\nAfter pengzhang operation.\n");
output(data);
printf("\ndata1:\n");
printf("\nThe orignal data is:\n");
output(data1);
pengzhang(data1);
printf("\nAfter pengzhang operation.\n");
output(data1);
shousuo(data1);
printf("\nAfter shousuo operation.\n");
output(data1);
}
運(yùn)行結(jié)果:
data:
The original data is:
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1
1 1 1 1
1 1 1 1 1 1
1 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1
After shousuo operation.
1 1 1 1 1
1 1 1 1
1 1
1 1 1 1
1 1
1 1
1 1 1
After pengzhang operation.
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1
1 1
1 1 1 1
1 1 1 1 1 1
1 1 1 1 1
1 1
1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1
data1:
The orignal data is:
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1
1 1 1 1
1 1 1 1 1 1
1 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1
After pengzhang operation.
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
After shousuo operation.
1 1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -