基于 Canny 算子的图像边缘检测,用 Matlab 写起来其实还挺顺手的。edge(I, 'canny', thresh, sigma)这个函数,核心就是看你怎么调那个threshsigma,一个决定敏感度,一个决定平滑程度。想省事,参数留空让算法自己来搞也行。

imread读图,用fspecialimfilter一下,edge一把梭,图像轮廓就出来了。顺便试了下sobelprewittroberts这些算子,效果各有不同,canny 确实清晰度高点,边缘更锐利。

代码也不复杂,几行就能搞定:

b1 = imread('nir.bmp');
h58 = fspecial('gaussian', 5, 0.8);
b = imfilter(b1, h58);
bw5 = edge(b, 'canny');
figure; imshow(bw5);
imwrite(bw5, 'nirbwcanny.bmp');

如果你是刚入门图像,这段代码挺适合拿来练手的。想深入点的,可以看看下面这些教程链接,边学边改挺有意思: