【matlab代码练习17】形态学图像处理

1. 创建结构元素

在MATLAB中,采用函数strel()创建结构元素。

close all; clear all; clc; 

se1 = strel('square', 3)   % 方形结构元素
se2 = strel('line', 10, 45)  % 线性结构元素,角度为45°

2. 结构元素的分解

在MATLAB中,采用函数getsequence()进行结构元素的分解。分解结构元素,可以提高执行效率和运行速度。

close all; clear all; clc; 

se = strel('diamond', 3)   % 创建菱形结构元素
seq = getsequence(se)   % 结构元素分解

3. 创建图像并进行膨胀操作

在MATLAB中,采用函数imdilate()进行膨胀操作。

close all; clear all; clc; 

bw = zeros(9, 9); % 创建二值图像
bw(3:5, 4:6) = 1; 
figure; 
subplot(121), imshow(bw);

se = strel('square', 3); % 方形结构元素
bw2 = imdilate(bw, se); 
subplot(122), imshow(bw2); 

4. 对二值图像进行膨胀

close all; clear all; clc; 

bw = imread('text.png'); % 读入二值图像
figure; 
subplot(121), imshow(bw); 

se = strel('line', 11, 90); % 线性结构元
bw2 = imdilate(bw, se); 
subplot(122), imshow(bw2); 

5. 对灰度图像进行膨胀

close all; clear all; clc; 

I = imread('rice.png'); 
figure;
subplot(121), imshow(I); 

se = strel('disk', 3); 
J = imdilate(I, se); 
subplot(122), imshow(J); 

6. 对灰度图像进行腐蚀

在MATLAB中,采用函数imerode()进行腐蚀操作。

close all; clear all; clc; 

I = imread('rice.png'); 
se = strel('disk', 3); 
J = imerode(I, se); 
figure; 
subplot(121), imshow(I);
subplot(122), imshow(J);

7. 对图像进行腐蚀再膨胀操作

close all; clear all; clc; 

I = imread('rice.png'); 
figure;
subplot(131), imshow(I); 

se = strel('disk', 3); 
J = imerode(I, se);  % 腐蚀
subplot(132), imshow(J); 
K = imdilate(J, se); % 膨胀
subplot(133), imshow(K); 

8. 对图像进行开操作

使用相同的结构元素,首先对图像进行腐蚀,然后对图像进行膨胀。在MATLAB中,采用函数imopen()进行二值图像或灰度图像的开操作。

close all; clear all; clc; 

I = imread('rice.png'); 
se = strel('disk', 3); 
J = imopen(I, se); 
figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

经过开操作,去除了图像中比较小的白点。

9. 对图像进行闭操作

使用相同的结构元素,首先对图像进行膨胀,然后对图像进行腐蚀。在MATLAB中,采用函数imclose()进行二值图像或灰度图像的闭操作。

close all; clear all; clc; 

I = imread('rice.png'); 
se = strel('disk', 3); 
J = imclose(I, se); 
figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

10. 高帽滤波(top-hat filtering)

从图像中减去形态学开操作后的图像。通过高帽滤波可以增强图像的对比度。在MATLAB中,采用函数imtophat()对二值图像或灰度图像进行高帽滤波。

close all; clear all; clc; 

I = imread('rice.png'); 
se = strel('disk', 11); 
J = imtophat(I, se); 
K = imadjust(J); 
figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J);
subplot(133), imshow(K); 

11. 低帽滤波(bottom-hat filtering)

从图像中减去形态学闭操作后的图像。通过低帽滤波可以获取图像的边缘。在MATLAB中,采用函数imbothat()对二值图像或灰度图像进行低帽滤波。

% 通过高帽滤波和低帽滤波增强图像的对比度
close all; clear all; clc; 
I = imread('rice.png'); 
se = strel('disk', 7); 
J = imtophat(I, se); 
K = imbothat(I, se); 
L = imsubtract( imadd(I, J), K ); % I+J-K
figure; 
subplot(121), imshow(I); 
subplot(122), imshow(L); 

12. 图像填充

在MATLAB中,采用函数imfill()对二值图像或灰度图像进行填充操作。

12.1 填充二值图像

close all; clear all; clc; 

I = imread('coins.png'); 
J = im2bw(I);
K = imfill(J, 'holes'); % 填充二值图像中的空洞
figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J); 
subplot(133), imshow(K); 

12.2 填充灰度图像

close all; clear all; clc; 

I = imread('tire.tif'); 
J = imfill(I, 'holes'); % 填充灰度图像中的空洞
figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

13. 极大值和极小值

对一幅图像来说,可以有多个局部极大值或极小值,但只有一个最大值或最小值。在MATLAB中,采用函数imregionalmax()获取图像的所有局部极大值,采用函数imregionalmin()获取局部极小值。

imregionalmax()的调用格式为:

BW = imregionalmax(I, conn):该函数获取灰度图像I的局部极大值,返回值BW为和原图像I大小相同的二值图像,BW中元素1对应的是极大值,元素0对应的是非极大值。参数conn为连通类型,对于二维图像,conn可以取值为4或8,默认值为8。

imregionalmin()的调用格式如上相似。

% 获取图像的所有局部极大值
close all; clear all; clc; 
I = 10 * ones(6, 10); 
I(3:4, 3:4) = 13; 
I(4:5, 7:8) = 18; 
I(2, 8) = 15; 
I
bw = imregionalmax(I);
bw

                          

在MATLAB中,采用函数imhmax()可以对图像中的极大值进行抑制,采用函数imhmin()对图像中的极小值进行抑制。

imhmax()的调用格式如下:

I2=imhmax(I, h, conn):该函数去除和周围像素的灰度差值小于h的局部极大值。参数h为非负的标量。返回值I2为和原图像I大小相同的灰度图像,极大值处的灰度值为原灰度值减去h后的值,其他像素的值保持不变。conn为连通类型,对于二维图像来说,可取4或8,默认值为8。

imhmin()的调用格式如上相似。

% 对局部极大值抑制
close all; clear all; clc; 
I = 2 * ones(5, 10); 
I(2:4, 2:4) = 3; 
I(4:5, 6:7) = 9; 
I(2, 8) = 5; 
I
J = imregionalmax(I); % 获取所有极大值
J
K = imhmax(I, 4); % 抑制极大值
K

14. 图像的边界测定

对于灰度图像,可以通过形态学的膨胀和腐蚀来获取图像的边缘。通过形态学获取灰度图像边缘的优点是对边缘的方向性依赖比较小。

14.1 通过膨胀和腐蚀获取灰度图像的边缘

close all; clear all; clc; 

I = imread('rice.png'); 
se = strel('disk', 1); 
J = imdilate(I, se); 
K = imerode(I, se); 
L = J - K; % 膨胀减去腐蚀
figure;
subplot(121), imshow(I); 
subplot(122), imshow(L); 

14.2 获取二值图像的边缘

在MATLAB中,采用函数bwperim()获取二值图像的边缘。

close all; clear all; clc; 
I = imread('rice.png');
BW = imbinarize(I, graythresh(I)); 
J = bwperim(BW, 8);
figure; 
subplot(131), imshow(I); 
subplot(132), imshow(BW); 
subplot(133), imshow(J); 

15. 二值图像的形态学操作

在MATLAB中,采用函数bwmorph()可以进行二值图像的大量形态学操作,例如:图像的骨架化、图像的细化、开操作、闭操作等。

15.1 二值图像的细化

close all; clear all; clc; 

I = imread('vein.bmp'); 
figure; 
subplot(121), imshow(I); 

K = bwmorph(I, 'thin', Inf); 
subplot(122), imshow(K); 

15.2 二值图像的骨架化

图像的骨架化是将图像中所有对象都简化为线条,但不修改图像的基本结构,同时保留图像的基本轮廓。

close all; clear all; clc; 

I = imread('vein.bmp'); 
figure; 
subplot(121), imshow(I); 

K = bwmorph(I, 'skel', Inf); 
subplot(122), imshow(K); 

15.3 移除二值图像的内部像素点

如果某个像素点的4个邻域都为1,则将该像素点的值设置为0,只剩下图像的边界像素点。

close all; clear all; clc; 

I = imread('circles.png'); 
figure; 
subplot(121), imshow(I); 

K = bwmorph(I, 'remove'); 
subplot(122), imshow(K); 

16. 二值图像的其他形态学操作

主要包括极限腐蚀、查表操作、图像的标记、对象的选择、图像的面积、欧拉数等。

16.1 二值图像的极限腐蚀

在MATLAB中,采用函数bwulterode()进行图像的极限腐蚀,每个对象最后变为一个像素点为止。

close all; clear all; clc; 

I = imread('rice.png'); 
I = im2bw(I, graythresh(I)); 
J = bwulterode(I); 
figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

16.2 二值图像的标记

对属于同一个连通域的所有像素分配相同的编号,对不同的连通域分配不同的编号,称为连通域的标记。在MATLAB中,采用函数bwlabel()和函数bwlabeln()进行连通域的标记操作。bwlabel()仅支持二维的二值图像,bwlabeln()支持任意维数的二值图像。

close all; clear all; clc; 

bw = zeros(4, 8);
bw(2:3, 2:3) = 1;
bw(2, 5) = 1;
bw(3, 7) = 1 
[L, num] = bwlabel(bw, 8)  % 二值图像的标记

函数bwlabel()返回的标记矩阵,可以通过函数label2rgb()进行显示。函数label2rgb()将标记矩阵转换为RGB彩色图像。

close all; clear all; clc; 

I = imread('rice.png'); 
level = graythresh(I); 
I = imbinarize(I, level); 
[L, num] = bwlabel(I, 8); 
J = label2rgb(L); 

figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J);

16.3 二值图像的对象选择

在MATLAB中,采用函数bwselect()在二值图像中选择单个的对象,要求图像必须是二维的。

BW2=bwselect(BW, c, r, n):该函数对输入的二值图像BW进行对象选择。输入参数(c, r)为对象的像素点坐标,c和r的维数必须相同。参数n为对象的连通类型,可取4或8。返回值BW2为选择了指定对象的二值图像,和原图像BW的大小相同。

close all; clear all; clc; 

I = imread('text.png'); 
c = [43, 185, 212]; % 对象的横坐标
r = [38, 68, 181]; % 对象的纵坐标
J = bwselect(I, c, r, 4); 

figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

BW2=bwselect(BW, n):该函数采用交互的方式,用户采用鼠标选择像素点的位置。

close all; clear all; clc; 

I = imread('text.png'); 
J = bwselect(I, 4); 

figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J);

16.4 二值图像的面积

面积是二值图像中像素值为1的像素个数。在MATLAB中,采用函数bwarea()计算二值图像的面积。

total=bwarea(bw):该函数计算输入的二值图像bw的面积。返回值total为得到的面积值。在计算二值图像的面积时,不是简单地计算像素值为1的像素个数,而是为每个像素设置一个权值,采用加权求和的方式得到面积。

在计算二值图像的面积时,像素的权值,通过该像素的2×2的邻域像素值来决定。例如:如果邻域内的像素值都为0,则权值为0;如果邻域内的像素值都为1,则权值为1。

close all; clear all; clc; 

I = imread('rice.png'); 
level = graythresh(I); 
I = imbinarize(I, level); 

se = strel('disk', 3); 
J = imdilate(I, se); 

Ia = bwarea(I); 
Ja = bwarea(J); 
(Ja - Ia) / Ia  % 面积增加的百分比 

figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

猜你喜欢

转载自blog.csdn.net/qq_15971883/article/details/80483255
今日推荐