十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
定义:每个像素的取值均为0或1,称这样的图像为二值图像。
成都创新互联-专业网站定制、快速模板网站建设、高性价比武都网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式武都网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖武都地区。费用合理售后完善,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++)/*清除数据*/
for(j=0;jN;j++)
bianyuan[i][j]=0;
for(i=1;iM-1;i++)
for(j=1;jN-1;j++)
{
inner=1;/*假设该像素或为物体,或为背景*/
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函数太罗嗦了,不够简练,想了一下,改成了下面的样子,函数接口不变:
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.边沿触发最大的特点是只在水平的边缘改变外翻盖奖励的那一刻是有效的。相对JK主站和从站中,良好的稳定性的优点,激励电平只需要保证在短时间内向边缘稳定,外界干扰的窗口是小的。
c语言里没有这个函数area,但是可以自定义函数。
函数定义:
使用:
返回值类型 函数名(类型 变量名,类型 变量名,…)
{
函数体;
return (数据);
}
例如:
int sum(int a, int b)
{
return a + b;
}
扩展资料
注意:
1、c语言一般根据函数的功能来取函数名,全部使用小写单词,多个单词之间用下划线分隔,如:add_to_arr。
2、参数的个数、类型由函数的功能决定,被调用时由调用者提供。如果函数不需要任何参数则写void,不要空着。
3、返回值类型根据函数的结果决定,如果不需要返回值则写void。
4、如果函数的定义出现在调用之前,声明可以省略。
5、函数声明时,参数的变量名可以省略。
6、如果不写返回值类型(会有警告),则默认为int类型返回值。
#includereg52.h //引用库文件
void delay() //延时函数
{
unsigned char i,j; //定义两个变量,用于空循环
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; //选择负跳变来触发外中断
while(1) //用于反复循环
{
for(i=0;i8;i++)
{
P1=~(1i);
delay(); //调用延时函数
while(flag!=1);
}
i=0;
//
}
}
/**************************************************************
函数功能:外中断T0的中断服务程序
**************************************************************/
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
flag=~flag;
}
仿真图:
楼主的采纳率好低啊(时间久了,估计给你回答的人会变少),不过我还是希望楼主能采纳