是由高等数学中梯度知识推导出来的,此处不再说明,不懂的记住这个结论即可。在此基础上,再结合其他操作,就能得到各种不同效果的边缘检测算子了。
在Matlab中,目前支持如下算子:
1. Prewitt算子
Prewitt算子就是上述思想的一个直接体现,通过算子形式我们可看出(a)为x的差分,(b)为y的差分,其大小为3×3,:
BW = edge(I,'prewitt')
BW = edge(I,'prewitt',thresh)
thresh为一个阈值,当上述的Prewitt模板与每个像素点进行运算之后,将其得到的值与thresh比较,若>thresh,则视为边缘像素点,若<,则视为非边缘像素点。若未指定则由Matlab自行运算之后取最佳阈值。
当输入此命令时还可将matlab算出的thresh输出
[BW,thresh] = edge(I,'prewitt',)
BW = edge(I,'prewitt',thresh,direction)
Direction表示检测方向,与每个像素点进行运算既可沿着竖直方向运算也可沿着水平方向运算,也可两个方向都进行,于是direction有如下命令:
'horizontal' or 'vertical' edges, or 'both' (默认情况为both).
BW = edge(I,'prewitt',OPTIONS)
OPTIONS提供两个操作'nothinning'、 'thinning','nothinning'是对得到的边缘检测图像不进行细化处理,'thinning'则是进行细化处理,因为边缘检测后的图像难免会因为原始图像中的边缘部分灰度过渡问题而出现过渡区域全被视为边缘部分,'thinning'操作后能得到单像素线的边缘检测图像。
Matlab中的源码程序主体如下:
function eout = edgeinprewitt(I)
a = I;
kx = 1;%
ky = 1;%kx ky均为1,检测方式为both
%Transform to a double precision intensity image if necessary
if ~isa(a,'double') &&~isa(a,'single')
a= im2single(a);
end
op = fspecial('prewitt')/6; % Prewitt approximationtoderivative
x_mask = op';
y_mask = op;
%compute the gradient in x and y direction
bx = imfilter(a,x_mask,'replicate');
by = imfilter(a,y_mask,'replicate');
%compute the magnitude
b = kx*bx.*bx + ky*by.*by;%将沿竖直方向边缘检测和沿水平方向边缘检测得到的边缘图像叠加在一起
cutoff = 4*mean2(b);%用边缘检测后的图像的平均值来近似表示信噪比
% if thinning
% e =computeedge(b,bx,by,kx,ky,int8(offset),100*eps,cutoff);
%边缘细化算法,由于computeedge为内部MEX函数,故此处将其注释掉,输出的便是具有粗边缘的图像
% else
e = b > cutoff;%得出便是未经过边缘细化的图像
% end
eout = e;
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-33967-1.html
芝麻粉本身就是熟了的
武器的火力强度