10.1.2 线检测
-
检测指定方向的线
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的绝对值
图像6为值满足条件 g >= T的所有点(白色),其中g是图像5所示的图像
10.1.3 使用edge函数的边缘检测
- Sobel边缘检测器
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边缘检测器产生的最好结果
10.2 使用Hough变换的线检测
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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,[])
10.2.1 使用Hough变换做峰值检测
10.2.2 使用Hough变换做线检测和链接
10.3 阈值处理
10.3.1 全局阈值处理
-
函数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的结果
10.3.2 局部阈值处理
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('顶帽后进行阈值处理');