【十】形态学图像处理

1 预备知识

集合与元素

集合与集合

反射和平移

结构元素:设有两幅图像A、S。若A是被处理的图像,二S是用来处理A的,则称S为结构元素。

2 二值图像中的基本形态学运算

2.1 腐蚀

取一个结构元素(多个像素组成的形状),在图像中所有符合其结构的区域橘色腐蚀。

Matlab实现

I = imread('erode_dilate.bmp'); 
%二值形态学处理中将灰度图像中所有非0值都看作是1,即前景物体
se1 = strel('square', 3); %3*3的正方形结构元素
Ib= imerode(I, se1); %腐蚀
se2 = strel([0 1 0; 1 1 1; 0 1 0]); %3*3的十字结构元素
Ic= imerode(I, se2); %腐蚀
se3 = strel('square', 5) ;%5*5的正方形结构元素
Id= imerode(I, se3); %腐蚀
se4 = strel('square', 6); %6*6的正方形结构元素
Ie= imerode(I, se4); %腐蚀
se5 = strel('square', 7) ;%7*7的正方形结构元素
If= imerode(I, se5); %腐蚀
subplot(3,2,1),imshow(I),title('原图像');
subplot(3,2,2),imshow(Ib),title('经3*3正方形结构元素腐蚀');
subplot(3,2,3),imshow(Ic),title('经3*3十字形结构元素腐蚀');
subplot(3,2,4),imshow(Id),title('经5*5正方形结构元素腐蚀');
subplot(3,2,5),imshow(Ie),title('经6*6正方形结构元素腐蚀');
subplot(3,2,6),imshow(If),title('经7*7正方形结构元素腐蚀');

在这里插入图片描述

2.2 膨胀

膨胀是将结构元素的原点与图像对应的像素匹配进行扩张。

Matlab实现

I = imread('starcraft.bmp'); %读入图像
Ib = imerode(I, [1 1 1; 1 1 1; 1 1 1]) ;   %3*3正方形结构元素的腐蚀
Ic = imerode(Ib, [0 1 0; 1 1 1; 0 1 0]);   %3*3十字形结构元素的腐蚀
Id = imdilate(Ic, [1 1 1; 1 1 1; 1 1 1]);  %3*3正方形结构元素的膨胀
Ie = imdilate(Id, [1 1 1; 1 1 1; 1 1 1]);  %3*3正方形结构元素的膨胀
If = imdilate(Ie, [0 1 0; 1 1 1; 0 1 0]);  %3*3十字形结构元素的膨胀

subplot(3,2,1),imshow(I),title('原图像');
subplot(3,2,2),imshow(Ib),title('经3*3正方形结构元素腐蚀');
subplot(3,2,3),imshow(Ic),title('经3*3十字形结构元素腐蚀');
subplot(3,2,4),imshow(Id),title('经3*3正方形结构元素膨胀');
subplot(3,2,5),imshow(Ie),title('经3*3正方形结构元素膨胀');
subplot(3,2,6),imshow(If),title('经3*3十字形结构元素膨胀');

在这里插入图片描述

2.3 开运算

开运算就是先腐蚀后膨胀。

I = imread('erode_dilate.bmp');
Io = imopen(I,ones(6,6));%采用6*6的正方形结构元素开运算
subplot(1,2,1),imshow(I),title('原图像');
subplot(1,2,2),imshow(Io),title('经6*6的正方形结构元素开运算图像');

在这里插入图片描述

2.4 闭运算

闭运算就是先膨胀后腐蚀。
Matlab实现

I = imread('erode_dilate.bmp');
Io = imclose(I,ones(6,6));%采用6*6的正方形结构元素闭运算
subplot(1,2,1),imshow(I),title('原图像');
subplot(1,2,2),imshow(Io),title('经6*6的正方形结构元素闭运算图像');

在这里插入图片描述

3 二值图像中的形态学应用

3.1 击中与不击中

取结构元素A,B为A的补集,黑白图像为X。用A去腐蚀图像X,然后用B去腐蚀图像X的补集,得到的结果相减就是击中击不中变换,通过这个方法可以获得一些特殊部分(如边界)。

Matlab实现

I = zeros(120, 180);
I(11:80, 16:75) = 1;
I(56:105, 86:135) = 1;
I(26:55, 141:170) = 1;
 
% 生成结构元素S
se = zeros(58, 58);
se(5:54, 5:54) = 1; % 物体S1 

% 击中击不中变换
Ie1 = imerode(I, se); % 物体腐蚀
Ic = 1-I; % I的补
S2 = 1-se;
Ie2 = imerode(Ic, S2); % 背景腐蚀 %得到图10.16(f)
Ihm = Ie1 & Ie2; % 两次腐蚀的交集
subplot(3,3,1),imshow(I),title('原始图像X');
subplot(3,3,2),imshow(se),title('S(白色部分为物体S1)');
subplot(3,3,3),imshow(Ie1),title('I的腐蚀');
subplot(3,3,4),imshow(Ic),title('原始图像X的补集Xc');
subplot(3,3,5),imshow(S2),title('Sc(白色部分为背景S2)');
subplot(3,3,6),imshow(Ie2),title('Ic的腐蚀');
subplot(3,3,8),imshow(Ihm),title('击中与不击中结果');%I的腐蚀与Ic的腐蚀的交集

在这里插入图片描述

3.2 边界提取与跟踪

3.2.1 边界提取

提取二值图像的边界。

Matlab实现

I = imread('head_portrait.bmp');
se = strel('square',3);%采用3*3的正方形结构元素
Ie = imerode(I,se);
Iout = I - Ie;
subplot(1,2,1),imshow(I),title('原图像');
subplot(1,2,2),imshow(Iout),title('边界提取后的图像');

在这里插入图片描述

3.2.2 边界跟踪

从下边界的像素依次找到其余像素,完成整条边界的跟踪。

3.3 区域填充

可视为边界提取的反过程。

3.4 连通分量提取

实质上就是标注连通分量的过程,可用来确定区域的某个位置(如中心)。

Matlab实现

定位嘴的中心

I = imread('mouth.bmp');
Id = im2double(I);
Ibw = im2bw(Id, 0.38); % 以0.38为阈值二值化
Ibw = 1 - Ibw; %为在Matlab中进行处理,将图像反色
subplot(1,2,1),imshow(Id),title('原图像');
subplot(1,2,2),imshow(Ibw),title('经二值化后定位嘴的中心');
hold on
[L, num] = bwlabel(Ibw, 8); % 标注连通分量
disp(['图中共有' num2str(num) '个连通分量'])
 
% 找出最大的连通分量(嘴)
max = 0; % 当前最大连通分量的大小
indMax = 0; % 当前最大连通分量的索引
for k = 1:num
    [y x] = find(L == k); % 找出编号为k的连通区的行索引集合y和列索引集合x
    
    nSize = length(y); %计算该连通区中的像素数目
    if(nSize > max)
        max = nSize;
        indMax = k;
    end
end
 
if indMax == 0
    disp('没有找到连通分量')
    return
end
 
% 计算并显示最大连通分量(嘴)的中心
[y x] = find(L == indMax);
yMean = mean(y);
xMean = mean(x);
plot(xMean, yMean, 'Marker', 'o', 'MarkerSize', 14, 'MarkerEdgeColor', 'w', 'MarkerFaceColor', 'w');
plot(xMean, yMean, 'Marker', '*', 'MarkerSize', 12, 'MarkerEdgeColor', 'k'); % 得到8.24(c)

在这里插入图片描述

细菌计数

I = imread('bacteria.bmp');
Ibw = imbinarize(I, 0.23); % 以0.23为阈值二值化
Ibw = 1 - Ibw; %为在Matlab中进行处理,将图像反色
[L1,num1] = bwlabel(Ibw,8);
Idil = imdilate(Ibw,ones(3,3));
[L2,num2] =bwlabel(Idil,8);
disp(num1);
disp(num2);
subplot(1,2,1),imshow(Ibw),title('原图像');
subplot(1,2,2),imshow(Idil),title('边界提取后的图像');

【输出结果】
原图像 num=23
边界提取后的图像 num=22
在这里插入图片描述

3.5 细化算法

用来描绘物体的集合形状和拓扑结构。

3.6 像素化算法

用来找目标对象及位置关系。

3.7 凸壳

这个方法可以找到物体的最小凸多边形。

3.8 bwmorph函数

很多形态学操作都可以通过bwmorph函数实现功能,函数的可选参数如下:

bridge:连接断开的像素

clean:去除图像中孤立的前景像素

diag:采用对角线填充, 去除八邻域的背景

fill:填充单个像素的孔洞

hbread:去掉前景中的H形连结

majority:如果一个像素的8邻域中有等于或超过5个像素点的像素值为1, 则将该点像素值置1

remove:如果一个像素点的4邻域都为1, 则该像素点将被置0

shrink:将物体收缩为一个点或者带洞的环形

skel:骨骼化图像

spur:去除“毛刺”

thicken:粗话物体

thin:将物体细化至最低限度相连的线形

4 灰度图像中的基本形态学运算

4.1 灰度膨胀

4.2 灰度腐蚀

Matlab实现

I = imread('lena.jpg');
seHeight = strel(ones(3,3),ones(3,3));%3*3正方形单位高度的结构元素
Idil = imdilate(I,seHeight);%灰度膨胀;
Iero = imerode(I,seHeight);%灰度腐蚀

subplot(1,3,1),imshow(I),title('原图像');
subplot(1,3,2),imshow(Idil),title('灰度膨胀后的图像');
subplot(1,3,3),imshow(Iero),title('灰度腐蚀后的图像');

在这里插入图片描述

4.3 灰度开、闭运算及其实现

基本同二值图像

4.4 顶帽变换

值为图像f和图像f的开运算之差,用来解决非均匀光照问题。
Matlab实现

I = imread('rice.png');
subplot(2, 2, 1), imshow(I, []),title('原图像');
thresh = graythresh(I); %自适应确定阈值
Ibw = im2bw(I, thresh);
subplot(2, 2, 2), imshow(Ibw, []),title('进过自适应调节阈值后的图像');
subplot(2, 2, 3), surf(double(I(1:8:end,1:8:end))),zlim([0 255]),colormap gray,title('三维可视化效果');
bg = imopen(I,strel('disk',15));%半径为15的圆形结构元素进行灰度开运算提取背景曲面
subplot(2, 2, 4), surf(double(bg(1:8:end,1:8:end))),zlim([0 255]), colormap gray,title('灰度开运算得到的背景区间');
figure;
Itophat = imsubtract(I, bg); %顶帽变换
subplot(2, 2, 1), imshow(Itophat),title('顶帽变换图像');
subplot(2, 2, 2), surf(double(Itophat(1:8:end,1:8:end))),zlim([0 255]),title('顶帽变换图像的三维可视化效果');
I2 = imadjust(Itophat);%对比度拉伸
subplot(2, 2, 3), imshow(I2),title('顶帽变换图像的对比度拉伸');
thresh2 = graythresh(I2);%自适应确定阈值
Ibw2 = im2bw(I2, thresh2); 
subplot(2, 2, 4), imshow(Ibw2),title('顶帽变换后的二值化图像'); 

在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值