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);
转载自:https://blog.csdn.net/qq_15971883/article/details/80483255