%亲测过,如果g11 选用图像灰度线性拉伸,得到的边缘检测的效果更好。
g11=imread('D:\my work\alignment\Vibration\X8 gain 0.18 Tin 2D16F.bmp');
mask1=[-1 -2 -1;0 0 0;1 2 1]; % 建立方向模板
mask2=[-2 -1 0;-1 0 1;0 1 2];mask3=[-1 0 1;-2 0 2;-1 0 1];
mask4=[0 1 2;-1 0 1;-2 -1 0];
mask5=[1 2 1;0 0 0;-1 -2 -1];
mask6=[2 1 0;1 0 -1;0 -1 -2];
mask7=[1 0 -1;2 0 -2;1 0 -1];
mask8=[0 -1 -2;1 0 -1;2 1 0];
I = im2double(g11); % 将数据图像转化为双精度
d1 = imfilter(I, mask1); % 计算8个领域的灰度变化
d2 = imfilter(I, mask2);
d3 = imfilter(I, mask3);
d4 = imfilter(I, mask4);
d5 = imfilter(I, mask5);
d6 = imfilter(I, mask6);
d7 = imfilter(I, mask7);
d8 = imfilter(I, mask8);
dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵
dd = max(dd,abs(d3));
dd = max(dd,abs(d4));
dd = max(dd,abs(d5));
dd = max(dd,abs(d6));
dd = max(dd,abs(d7));
dd = max(dd,abs(d8));
grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像
level = graythresh(grad); % 计算灰度阈值
BW = im2bw(grad,level); % 用阈值分割梯度图像
imshow(BW);
师傅曾说过,做图像处理的不要总想着进行膨胀、腐蚀之类的形态学操作,虽然这样可以使图像变得美观,但是会丢失很多的细节信息。以此为戒。。。