定義:每個像素的取值均為0或1,稱這樣的圖像為二值圖像。
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比武都網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式武都網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋武都地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
算法:檢查所有像素,若該像素為物體上與背景接觸的像素(四連通像素中既有背景像素又有物體像素),則為邊界。
程序:
#define M 30
#define N 20
void edge(int image[M][N],int bianyuan[M][N])
{
int i,j;
int inner=1,outer=1;
for (i=0;iM;i++)/*清除數(shù)據(jù)*/
for(j=0;jN;j++)
bianyuan[i][j]=0;
for(i=1;iM-1;i++)
for(j=1;jN-1;j++)
{
inner=1;/*假設(shè)該像素或為物體,或為背景*/
outer=1;
if(image[i-1][j]==0||image[i+1][j]==0||image[i][j-1]==0||image[i][j+1]==0)
inner=0;
if(image[i-1][j]==1||image[i+1][j]==1||image[i][j-1]==1||image[i][j+1]==1)
outer=0;
if(inner==0outer==0image[i][j]==1)/*像素周圍既有物體又有背景*/ bianyuan[i][j]=1;/*,且該像素為物體上的像素(image[i][j]==1),則定義為邊界*/
}
}
void output(int array[M][N],int n)
{
int i,j;
for(i=0;in;i++)
{
printf("\n");
for(j=0;jN;j++)
if(array[i][j]==1)
printf("1");
else
printf(" ");
}
}
void main()
{
int image[M][N]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0},
{0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0},
{0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0},
{0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0},
{0,1,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,0},
{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0},
{0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0}};
int bianyuan[M][N]={0};
int i,j;
printf("\nThe origianl image is:\n");
output(image,10);
edge(image,bianyuan);
printf("\nIts edge is:\n");
output(bianyuan,10);
}
寫完了,又看一下,感覺edge函數(shù)太羅嗦了,不夠簡練,想了一下,改成了下面的樣子,函數(shù)接口不變:
void edge(int image[M][N],int bianyuan[M][N])
{
int i,j;
for (i=0;iM;i++)
for(j=0;jN;j++)
bianyuan[i][j]=0;
for(i=1;iM-1;i++)
for(j=1;jN-1;j++)
{
int t=image[i-1][j]+image[i+1][j]+image[i][j-1]+image[i][j+1];
if(t0t4image[i][j]==1)/*周圍4個像素值介于1~3之間,*/
bianyuan[i][j]=1; /*且當前像素為物體,則其必為邊界*/
}
}
希望這段代碼對你有所幫助
1.SETB EA ;中斷總允許
SETB EX1 ;外中斷1允許
SETB IT1 ;脈沖方式(當IT1為0時,為電平方式)
然后就可以定義你要的初值。
2.邊沿觸發(fā)最大的特點是只在水平的邊緣改變外翻蓋獎勵的那一刻是有效的。相對JK主站和從站中,良好的穩(wěn)定性的優(yōu)點,激勵電平只需要保證在短時間內(nèi)向邊緣穩(wěn)定,外界干擾的窗口是小的。
c語言里沒有這個函數(shù)area,但是可以自定義函數(shù)。
函數(shù)定義:
使用:
返回值類型 函數(shù)名(類型 變量名,類型 變量名,…)
{
函數(shù)體;
return (數(shù)據(jù));
}
例如:
int sum(int a, int b)
{
return a + b;
}
擴展資料
注意:
1、c語言一般根據(jù)函數(shù)的功能來取函數(shù)名,全部使用小寫單詞,多個單詞之間用下劃線分隔,如:add_to_arr。
2、參數(shù)的個數(shù)、類型由函數(shù)的功能決定,被調(diào)用時由調(diào)用者提供。如果函數(shù)不需要任何參數(shù)則寫void,不要空著。
3、返回值類型根據(jù)函數(shù)的結(jié)果決定,如果不需要返回值則寫void。
4、如果函數(shù)的定義出現(xiàn)在調(diào)用之前,聲明可以省略。
5、函數(shù)聲明時,參數(shù)的變量名可以省略。
6、如果不寫返回值類型(會有警告),則默認為int類型返回值。
#includereg52.h ?//引用庫文件
void delay() //延時函數(shù)
{
unsigned char i,j; ?//定義兩個變量,用于空循環(huán)
for(i=0;i200;i++)
for(j=0;j200;j++)
?;
}
unsigned char flag;
void main()
{
unsigned char i;
flag=1;
EA=1; ? //開放總中斷
EX0=1; ?//允許使用外中斷
IT0=1; ?//選擇負跳變來觸發(fā)外中斷
while(1) ? //用于反復(fù)循環(huán)
{
for(i=0;i8;i++) ?
{
?P1=~(1i); ? ?
delay(); ?//調(diào)用延時函數(shù)
?while(flag!=1);
}
i=0;
? //
}
}
/**************************************************************
函數(shù)功能:外中斷T0的中斷服務(wù)程序
**************************************************************/
void int0(void) interrupt 0 using 0 //外中斷0的中斷編號為0
{
flag=~flag;
}
仿真圖:
樓主的采納率好低啊(時間久了,估計給你回答的人會變少),不過我還是希望樓主能采納