形态学图像处理
预备知识
二值图像,集合和逻辑运算符
与数学中的逻辑运算基本相同
f = imread('Fig4.41(a).jpg');
g = imread('FigProb4.09(left).jpg');
subplot(231),imshow(f),title('A');
subplot(232),imshow(g),title('B');
subplot(233),imshow(~f),title('A的补集');
subplot(234),imshow(f|g),title('AB的合集');
subplot(235),imshow(f&g),title('AB的并集');
subplot(236),imshow(f&~g),title('AB的差集');
膨胀和腐蚀
膨胀
在二值图像中“加长”或“变粗”的操作。膨胀定义为集合运算,A被B膨胀记为
原理:
A = imread('Fig9.05(a).jpg');
A = ~A;
B = [1 1 1;1 1 1;1 1 1];
A2 = imdilate(A,B);
subplot(121),imshow(A),title('原图');
subplot(122),imshow(A2),title('膨胀后');
结构元素的分解
se = strel('diamond', 5)
decomp = getsequence(se);
腐蚀
做与,或操作,结果是使原来的二值图像减小一圈
A = imread('Fig01.png');
se = strel('disk',10);
A2 = imerode(A,se);
subplot(221),imshow(A),title('原图');
subplot(222),imshow(A2),title('半径为10腐蚀');
se = strel('disk',5);
A3 = imerode(A,se);
subplot(223),imshow(A2),title('半径为5腐蚀');
A4 = imerode(A,strel('disk',20));
subplot(224),imshow(A2),title('半径为20腐蚀');
膨胀与腐蚀的组合
开:先腐蚀再膨胀,可以去掉目标外的孤立点
闭:先膨胀再腐蚀,可以去掉目标内的孔。
开运算与闭运算
开运算:C = imopen(A,B)
闭运算:C = imclose(A,B)f = imread('Fig02.png'); se = strel('square',20); fo = imopen(f,se); subplot(221),imshow(f),title('原图'); subplot(222),imshow(fo),title('b开运算'); fc = imclose(f,se); subplot(223),imshow(fc),title('c闭运算'); foc = imclose(fo,se); subplot(224),imshow(foc),title('b的闭运算')
击中或击不中变换
击中击不中变换(HMT),HMT变换可以同时探测图像的内部和外部。在研究图像中的目标物体与图像背景之间的关系上,HMT能够取得很好的效果。所以常被用于解决目标图像识别和模式识别等领域。
f = imread(‘Fig11.10.jpg’);
B1 = strel([0 0 0;0 1 1;0 1 0]);
B2 = strel([1 1 1;1 0 0;1 0 1]);
g = bwhitmiss(f,B1,B2);
subplot(121);imshow(f),title(‘原图’);
subplot(122);imshow(g),title(‘击中击不中变换’);
使用查找表
当击中击不中结构元素较小时,计算击中击不中变换的较快方法是使用查找表(LUT).
函数:endpoints
函数:bwmorphf = imread(‘Fig11.10.jpg’);
g = bwmorph(f, ‘skel’, Inf);
for k = 1:20
g = g & ~endpoints(g);
end
subplot(121);imshow(f);
subplot(122);imshow(g);
f = imread(‘Fig12.09(a).jpg’);
[L,n] = bwlabel(f);
[r,c] = find(L == 3);
rbar = mean(r);
cbar = mean(c);
imshow(f);
hold on
for k = 1:n
[r,c] = find(L == k);
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,’Marker’,’o’,’MarkerEdgeColor’,’k’,’MarkerFaceColor’,’k’,’MarkerSize’,10);
plot(cbar,rbar,’Marker’,’*’,’MarkerEdgeColor’,’w’);
end