小白学习图像处理——canny算法与实现(matlab)
主要参考 电子工业出版社的《数字图像处理 原理与实践matlab版》
step01 用二维高斯模板进行卷积以消除杂点
step02 用已结偏导数的有限差分来计算梯度的幅值和方向
step03 对帝都肤质进行非极大值抑制
step04 双阈值算法监测和连接边缘
step05 利用多尺度综合技术对结果进行优化。(优化的方法并不唯一,可以根据具体应用或针对具体图像特征再做考虑)
代码;
I=imread('D:\Desktop\TEST.jpg');
[R,C,D]=size(I);
Im=rgb2gray(I);
img=edge(Im,'canny',[0.032,0.08],3);//阈值矩阵的上界和下界可以调整
figure(1);
imshow(Im);
figure(2);
imshow(I);
figure(3);
imshow(img);
结果:
可以发现分割后的效果并不理想
在对植物部分进行分割后再次用canny进行边缘检测后的结果如下所示
植物界外的分割部分有所提高,但是植物的叶脉部分也被当做边缘提出了
接下来主要是通过调整阈值的取值范围以期获得较好的边缘检测结果
高阈值比较严格,求的边缘很少,认为高阈值的边缘都是有效。低阈值宽松,求的边缘很多(一般包括了高阈值求到的边缘),其中不少是无效的边缘(反正不想要的)。
先用高阈值求边缘。canny求得的边缘希望是连在一起的(通常是封闭的),但高阈值求的边缘一般断断续续。断开的地方如果低阈值求的边缘存在,就用低阈值的边缘接上去,目的让边缘尽量都连在一起。其它情况下低阈值的边缘是不用的。
两个阈值是有区别的,高的那个阈值是将要提取轮廓的物体与背景区分开来,就像阈值分割的那个参数一样,是决定目标与背景对比度的,低的那个阈值是用来平滑边缘的轮廓,有时高的阈值设置太大了,可能边缘轮廓不连续或者不够平滑,通过低阈值来平滑轮廓线,或者使不连续的部分连接起来。
最后调整结果任然不满意