问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求用C语言用Sobels算子方法编写图像边缘提取的程序算法!(急)

发布网友 发布时间:2022-04-23 04:47

我来回答

1个回答

热心网友 时间:2023-10-15 06:24

定义:每个像素的取值均为0或1,称这样的图像为二值图像。

算法:检查所有像素,若该像素为物体上与背景接触的像素(四连通像素中既有背景像素又有物体像素),则为边界。

程序:

#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;i<M;i++)/*清除数据*/
for(j=0;j<N;j++)
bianyuan[i][j]=0;
for(i=1;i<M-1;i++)
for(j=1;j<N-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==0&&outer==0&&image[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;i<n;i++)
{
printf("\n");
for(j=0;j<N;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;i<M;i++)
for(j=0;j<N;j++)
bianyuan[i][j]=0;
for(i=1;i<M-1;i++)
for(j=1;j<N-1;j++)
{
int t=image[i-1][j]+image[i+1][j]+image[i][j-1]+image[i][j+1];
if(t>0&&t<4&&image[i][j]==1)/*周围4个像素值介于1~3之间,*/
bianyuan[i][j]=1; /*且当前像素为物体,则其必为边界*/
}
}

希望这段代码对你有所帮助
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
古天乐的资料!!! 胆结石可以喝柠檬蜂蜜水吗 柠檬对结石有什么作用 胆结石可以吃柠檬吗 江西有哪些风景 行政处罚对象能不能是分公司 分公司是否能作为被行政处罚的对象 分享20份亚马逊运营过程中常用邮件回复模板 2024年上半年自考报名时间 22年辽宁省自考延期怎么退费 急求sobel算子检测边缘 Matlab程序代码 sobel 算子的计算 Gx,Gy为a图 matlab:试采用Sobel算子对一幅256灰度图像进行边缘提取 边缘检测算子有哪些?它们各有什么优缺点 下面是关于C++ Sobel算子的程序代码 相关知识了解 语句看不懂 希望大神能帮我注释下 方便我理解 谢谢 一些论文中提到的八方向的Sobel算子是怎么编程和实现的 Matlab关于图像边缘提取,用Sobel算子、Roberts算子、Prewitt算子,加QQ详谈 急用!! sobel算子原理是怎样的 sobel 算子和 canndy 算子的区别 sobel算子为什么是一阶导数 Sobel算子是什么? sobel算子里的阈值是怎么设的 Sobel算子的核心公式 Sobel和Kirsch算子的优缺点 sobel边缘检测优缺点与canny算子的优缺点? Sobel算子的介绍 美的中央空调是遥控还是线控 空调摇控加线控 美的空调遥控器控制空调不启动是为什么? 美的中央空调,标配线控,用遥控器可以遥控吗? 怎样制作小麦胚芽 小麦胚芽生吃还是熟吃 谁知道小麦胚芽有什么用? 长期吃小麦胚芽的危害是什么? 小麦胚芽有什么作用? 小麦胚芽的特点是什么? 小麦胚芽一天适宜吃多少克? 如何辨识小麦胚芽 小麦胚芽怎么吃? 小麦胚芽营养价值高吗? 藕带是莲藕的哪个部位 藕带和藕是什么关系呀? 藕带究竟是什么?是嫩藕吗? 藕和藕带有什么区别 藕带是什么 藕带的做法 藕带的功效与作用 藕带是荷花的什么部位? 藕带是莲藕的哪个部位 莲藕是植物的什么部位 藕带是莲藕吗 有哪些价值 请问一下,藕带是长在藕的哪个部位的? 藕带是莲藕的哪个部位图片