检测指定方向的线
f = imread('c:\图像\线检测样本.tif');
g = abs(imfilter(double(f),w));
figure,imshow(f)
figure,imshow(g)
gtop = g(1:120,1:120);
gtop = pixeldup(gtop,4);
figure,imshow(gtop,[])
gbot = g(end-119:end,end-119:end);
gbot = pixeldup(gbot,4);
figure,imshow(gbot,[]);
g = abs(g);
figure,imshow(g,[])
T = max(g(:));
g = g >= T;
figure,imshow(g)
图像1为原始图像
图像2使用-45度检测器处理后的结果
图像3是图像2的左上角放大图
图像4是图像2的右下角放大图
图像5为图像2的绝对值
Sobel检测器的调用方法为:
[g, t] = edge(f,‘sobel’,T,dir)
其中,f是输入图像,T是一个指定的阈值,dir指定检测边缘的首选方向:‘horizontal’,‘vertical’或’both’(默认值)。g是在被检测到边缘的位置处为1而在其他位置为0的逻辑类图像。输出参数是可选的,它是函数edge所用的阈值。若指定了T的值,则t = T。否则,若T未被赋值(或为空,[]),则函数edge会令t等于它自动确定的一个阈值,然后用于边缘检测。在输出参量中要包括t的主要原因之一是为了得到一个阈值的初始值。若使用语法g = edge(f)或[g,t] = egde(f),则函数edge会默认使用Sobel检测器。
图像1为原始图像
图像2为使用带有自动确定的阈值的一个垂直Sobel掩模后,函数edge导致的结果;
图像3为使用指定阈值后的结果
图像4是使用指定阈值来决定垂直边缘和水平边缘的结果
图像5使用函数imfilter(具有指定掩模和阈值)计算45度边缘的结果;
图像6是-45度边缘的结果
Prewitt边缘检测器(使用图10.5©)
基本语法:[g,t] = edge(f,‘prewitt’,T,dir)
该函数的参数和Sobel的参数相同。Prewitt检测器比Sobel检测器在计算上要简单一些,但比较容易产生一些噪声(系数为2的Sobel检测器可提供一种平滑作用)。
Roberts边缘检测器(使用图10.5(d))
基本语法:[g,t] = edge(f,‘roberts’,T,dir)
Laplacian of a Gaussian
零交叉检测器
这种检测器基于与LoG方法相同的概念,但卷积是使用指定的滤波函数H执行。调用语法为
[g, t] = edge(f,‘zerocross’,T,H)
其他参数的解释与LoG中的参数相同
Canny边缘检测器
Sobel,LoG和Canny边缘检测器的比较
f = imread('c:\图像\边缘检测样本.tif');
[g_sobel_default,ts] = edge(f,'sobel');
[g_log_default,tlog] = edge(f,'log');
[g_canny_default,tc] = edge(f,'canny');
figure,imshow(g_sobel_default)
figure,imshow(g_log_default)
figure,imshow(g_canny_default)
g_sobel_best = edge(f,'sobel',0.05);
g_log_best = edge(f,'log',0.003,2.25);
g_canny_best = edge(f,'canny',[0.04 0.10],1.5);
figure,imshow(g_sobel_best)
figure,imshow(g_log_best)
figure,imshow(g_canny_best)
图像1 - 3分别为使用默认选项’Sobel’,'log’和’canny’得到的边缘图像:
图像4 - 6交互地显示原图像的主要特征所得到的结果,该结果减少了无关的细节。这是到目前为止Canny边缘检测器产生的最好结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9EdThVV-1593138195503)(https://s2.ax1x.com/2019/07/13/Zhl4vn.png)]
f = imread('c:\图像\Hough函数样本.tif');
f = zeros(101,101);
f(1,1) = 1;
f(101,1) = 1;
f(1,101) = 1;
f(101,101) = 1;
f(51,51) = 1;
H = hough(f);
figure,imshow(H,[])
figure,imshow(f)
figure,imshow(H,[])
函数graythresh能够计算阈值,其语法为:T = graythresh(f)
其中,f是输入图像,T是产生的阈值。为了分割图像,我们在函数im2bw中使用阈值T。因为阈值已被归一化到范围[0,1]内,因此必须在使用阈值之前将其缩放到合适范围。例如,若f是uint8类图像,则我们在使用T之前要让T乘以255.
计算全局阈值
f = imread('c:\图像\计算阈值样本.tif');
T = 0.5*(double(min(f(:))) + double(max(f(:))));
done = false;
while~done
g = f >= T;
Tnext = 0.5*(mean(f(g)) + mean(f(~g)));
done = abs(T - Tnext) < 0.5;
T = Tnext;
end
figure,imshow(f)
T2 = graythresh(f)
T2 =
0.3961
>> T2 * 255
ans =
101
while~done
g = f >= T2;
T2next = 0.5*(mean(f(g)) + mean(f(~g)));
done = abs(T2 - Tnext) < 0.5;
T2 = T2next;
end
figure,imshow(g)
图1为原图像,图2为策略迭代的结果,图3为使用graythresh的结果
f = imread(‘c:\图像\计算阈值样本.tif’);
g = imsubtract(imadd(f, imtophat(f, strel('disk', 3))),imtophat(f, strel('disk', 3)));
subplot(1, 3, 1), imshow(f), title('原图');
subplot(1, 3, 2), imshow(g), title('顶帽后');
subplot(1, 3, 3), imshow(im2bw(g, graythresh(tofloat(g))))title('顶帽后进行阈值处理');