文章目录
Matlab实现形态学图像处理
目的
- 了解膨胀操作的应用,使用
strel函数定义结构元素,以及腐蚀操作的实现方法。 - 学会使用
imopen和imclose函数,结合IPT函数bwhitmiss进行形态学处理。 - 理解并应用灰度图像形态学中的开运算和闭运算。
- 学会利用形态学方法通过图像重构去除复杂背景。
内容
膨胀的简单应用
膨胀是形态学操作中的基本操作之一,用于扩大前景区域,连接孤立的点。这里我们使用结构元素对图像进行膨胀。
A = imread('D:\pic\DIP3E_CH04\Fig0419(a)(text_gaps_of_1_and_2_pixels).tif');
figure, imshow(A)
B = [0 1 0; 1 1 1; 0 1 0];
A2 = imdilate(A, B);
figure, imshow(A2)
使用 strel 函数分解结构元素的说明
strel 函数用于创建结构元素,这里我们使用 diamond 形状的结构元素。
se = strel('diamond', 5);
decomp = getsequence(se);
whos
decomp(1)
decomp(2)
decomp(3)
decomp(4)
腐蚀操作
腐蚀是形态学操作的另一个基本操作,用于缩小前景区域。下面的代码展示了如何使用不同半径的圆盘结构元素进行腐蚀操作。
A = imread('D:\pic\DIP3E_CH09\Fig0905(a)(wirebond-mask).tif');
figure, imshow(A) % 原图像
se = strel('disk', 10);
A2 = imerode(A, se);
figure, imshow(A2) % 半径为 10 的圆盘腐蚀后的图像
se = strel('disk', 5);
A3 = imerode(A, se);
figure, imshow(A3) % 半径为 5 的圆盘腐蚀后的图像
A4 = imerode(A, strel('disk', 20));
figure, imshow(A4) % 半径为 20 的圆盘腐蚀后的图像
函数 imopen 和 imclose 的应用
开运算(imopen)是腐蚀操作后进行膨胀操作,通常用于去除小的噪声。闭运算(imclose)是膨胀操作后进行腐蚀操作,通常用于填补小的孔洞。以下是它们的应用。
f = imread('D:\pic\DIP3E_CH09\Fig0905(a)(wirebond-mask).tif');
figure, imshow(f) % 原图像
se = strel('square', 20);
fo = imopen(f, se);
figure, imshow(fo) % 开运算后的图像
fc = imclose(f, se);
figure, imshow(fc) % 闭运算后的图像
foc = imclose(fo, se);
figure, imshow(foc) % 图像A2 经闭运算后的图像
使用 IPT 函数 bwhitmiss
bwhitmiss 函数用于形态学白点/黑点检测。这里我们使用两个不同的结构元素进行运算。
f = imread('D:\pic\DIP3E_CH09\FigP0918(left).tif');
figure, imshow(f)
B1 = strel([0 0 0; 0 1 1; 0 1 0]);
B2 = strel([1 1 1; 1 0 0; 1 0 0]);
g = bwhitmiss(f, B1, B2);
figure, imshow(g)
灰度图像形态学开运算和闭运算
开运算和闭运算在灰度图像中应用广泛,通常用于平滑或去除噪声。
%%%%%%%%% 使用开运算和闭运算做形态学平滑 %%%%%%%%%%%%%%
clear all
clc
f = imread('D:\pic\DIP3E_CH09\Fig0941(a)(wood_dowels).tif');
figure, imshow(f) % 原图像
se = strel('disk', 5);
fo = imopen(f, se);
figure, imshow(fo) % 开运算后的图像
foc = imclose(fo, se);
figure, imshow(foc) % 图像A2 经闭运算后的图像
fasf = f;
for k = 2:5
se = strel('disk', k);
fasf = imclose(imopen(fasf, se), se);
end
figure, imshow(fasf) %%%%%% 交替顺序滤波后的图像
使用顶帽变换
顶帽变换(Top-hat Transform)是开运算和原图像的差异,用于提取图像中的小物体或细节。
%%%%%%%%%% 使用顶帽变换 %%%%%%%%%%%
clear all
clc
f = imread('D:\pic\DIP3E_CH09\Fig0940(a)(rice_image_with_intensity_gradient).tif');
figure, imshow(f) % 原图像
se = strel('disk', 10);
fo = imopen(f, se);
figure, imshow(fo) % 经开运算处理后的图像
f2 = imsubtract(f, fo);
figure, imshow(f2)
f2 = imtophat(f, se);
figure, imshow(f2)
se = strel('disk', 3);
g = imsubtract(imadd(f, imtophat(f, se)), imbothat(f, se)); % 低帽、顶帽
figure, imshow(g)
颗粒分析
在图像分析中,颗粒分析用于计算不同尺寸的颗粒区域的大小和变化。
%%%%%%%%%%% 颗粒分析 %%%%%%%%%%%
clear all
clc
f = imread('D:\pic\DIP3E_CH09\Fig0940(a)(rice_image_with_intensity_gradient).tif');
sumpixels = zeros(1, 36);
for k = 0:35
se = strel('disk', k);
fo = imopen(f, se);
sumpixels(k + 1) = sum(fo(:));
end
figure, plot(0:35, sumpixels);
xlabel('k');
ylabel('surface area')
figure, plot(-diff(sumpixels))
xlabel('k');
ylabel('surface area reduction')
灰度图像形态学使用重构删除复杂图像的背景
形态学重构方法可以用于去除图像中的复杂背景,保留前景物体。以下是一个示例:
% 灰度图像形态学使用重构删除复杂图像的背景
clear all
clc
f = imread('D:\pic\DIP3E_CH09\Fig0944(a)(calculator).tif');
figure, imshow(f) % 原图像
f_obr = imreconstruct(imerode(f, ones(1, 71)), f);
figure, imshow(f_obr)
f_o = imopen(f, ones(1, 71)); % for comparison
figure, imshow(f_o)
f_thr = imsubtract(f, f_obr);
figure, imshow(f_thr)
f_th = imsubtract(f, f_o); % or imtophat(f, ones(1, 71))
figure, imshow(f_th)
g_obr = imreconstruct(imerode(f_thr, ones(1, 11)), f_thr);
figure, imshow(g_obr)
g_obrd = imdilate(g_obr, ones(1, 21));
figure, imshow(g_obrd)
f2 = imreconstruct(min(g_obrd, f_thr), f_thr);
figure, imshow(f2)
参考文献:
- [Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.
- [阮秋琦. 数字图像处理(MATLAB版)[M]. 北京:电子工业出版社, 2014.]
- [冈萨雷斯. 数字图像处理(第三版)[M]. 北京:电子工业出版社,
2309

被折叠的 条评论
为什么被折叠?



