1.对多张二值图像进行膨胀、腐蚀、观察并分析说明图像变化
2.对多张二值图像进行开运算、闭运算、观察并分析说明图像变化
3.使用bwmorph函数对图像进行骨架提取、细化、粗化运算,观察并分析说明图像变化。
图像膨胀是指对二值图像中的点(像素)进行膨胀操作,即将图像中较小的暗色区域消除,使其与周围亮色区域合并成为一块更大的区域。其基本原理是使用一个结构元素对待膨胀图像进行扫描,将当前结构元素与原始图像进行融合,取结构元素内像素值的最大值作为结果输出。最终输出的结果图像像素值更加平滑且具有连续性,相当于在图像中“填充”了一些空洞和细节,使得图像看起来更加的完整。
图像腐蚀主要作用是将二值图像中较小的亮色区域消除,使得图像中的边界细节更加清晰和明显。其基本原理是使用一个结构元素对待腐蚀图像进行扫描,将当前结构元素与原始图像进行滑动,取结构元素内像素值的最小值作为结果输出。最终输出的结果图像像素值更加集中和凝聚,可以去除小的局部细节使得图像更清晰,但是图像的连续性会受到破坏
开运算和闭运算是数字图像处理中经常使用的两种形态学操作。它们都可以通过图像膨胀和腐蚀操作来实现,并且经常通过这两种操作的组合来完成图像预处理、分割以及去除噪声等任务。
开运算和闭运算的基本概念:
开运算:先对图像进行腐蚀操作,再进行膨胀操作。其作用是去除图像中小且不规则的亮度区域,使得边界更加平滑,这样有助于去除孤立的小噪声点、断裂和细节。
闭运算:先对图像进行膨胀操作,再进行腐蚀操作。其作用是使得超过结构元素大小的区域被连接和填充,有助于消除图像中的小孔洞和断裂
bwmorph是MATLAB中的一个常用函数,用于对二值图像进行形态学变换。该函数可用于实现诸如膨胀、腐蚀、开运算、闭运算、骨架化等操作。其语法为:
BW2 = bwmorph(BW,operation,n)
其中,BW是待变换的二值图像,operation是指定的变换名称,n是描述该变换的附加参数。
调用matlab中自带的dilate函数
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
imshow('image1.jpg')
imshow('image2.png')
imshow('image3.png')
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
imshow(I1);
imshow(I2);
imshow(I3);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
bw1 = im2bw(I1,level1);
bw2 = imread('bw2.png');
bw3 = im2bw(I3,level3); %图像二值化
imshow(bw1);
imshow(bw2);
imshow(bw3);
%步骤四.定义一个结构元素,确定膨胀操作的范围和形状
SE1 = strel('square',5); %使用5*5的方形结构元素
dilated_img1 = imdilate(bw1,SE1); %进行图像膨胀
imshow(dilated_img1);
dilated_img2 = imdilate(bw2,SE1); %进行图像膨胀
imshow(dilated_img2);
dilated_img3 = imdilate(bw3,SE1); %进行图像膨胀
imshow(dilated_img3);
不调用matlab中自带的dilate函数进行膨胀
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
imshow('image1.jpg')
imshow('image2.png')
imshow('image3.png')
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
imshow(I1);
imshow(I2);
imshow(I3);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
bw1 = im2bw(I1,level1);
bw2 = imread('bw2.png');
bw3 = im2bw(I3,level3); %图像二值化
imshow(bw1);
imshow(bw2);
imshow(bw3);
%步骤四.定义一个结构元素,确定膨胀操作的范围和形状
%SE1 = strel('square',5); %使用5*5的方形结构元素
%dilated_img1 = imdilate(bw1,SE1); %进行图像膨胀
%imshow(dilated_img1);
%dilated_img2 = imdilate(bw2,SE1); %进行图像膨胀
%imshow(dilated_img2);
%dilated_img3 = imdilate(bw3,SE1); %进行图像膨胀
%imshow(dilated_img3);
SE = [0, 1, 0; 1, 1, 1; 0, 1, 0]; % 定义一个 3x3 的十字型结构元素
[row, col] = size(bw2);
dilated_img = zeros(row, col); % 初始化膨胀后的图像矩阵
for i = 2 : row-1
for j = 2 : col-1
if bw2(i, j) == 1 % 对前景像素进行膨胀
dilated_img(i-1:i+1, j-1:j+1) = dilated_img(i-1:i+1, j-1:j+1) | SE;
end
end
end
imshow(dilated_img);
调用imerode函数版本
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
imshow('image1.jpg')
imshow('image2.png')
imshow('image3.png')
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
imshow(I1);
imshow(I2);
imshow(I3);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
bw1 = im2bw(I1,level1);
bw2 = im2bw(I2,level2);
bw3 = im2bw(I3,level3); %图像二值化
imshow(bw1);
imshow(bw2);
imshow(bw3);
%对图像进行腐蚀操作
SE = strel('disk', 3); % 定义一个半径为 3 的圆形结构元素
eroded_img1 = imerode(bw1, SE); % 对当前图像进行腐蚀
eroded_img2 = imerode(bw2, SE); % 对当前图像进行腐蚀
eroded_img3 = imerode(bw3, SE); % 对当前图像进行腐蚀
imshow(eroded_img1);
imshow(eroded_img2);
imshow(eroded_img3);
不调用imerode函数版本
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
imshow('image1.jpg')
imshow('image2.png')
imshow('image3.png')
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
imshow(I1);
imshow(I2);
imshow(I3);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
bw1 = im2bw(I1,level1);
bw2 = im2bw(I2,level2);
bw3 = im2bw(I3,level3); %图像二值化
imshow(bw1);
imshow(bw2);
imshow(bw3);
%对图像进行腐蚀操作
% SE = strel('disk', 3); % 定义一个半径为 3 的圆形结构元素
% eroded_img1 = imerode(bw1, SE); % 对当前图像进行腐蚀
% eroded_img2 = imerode(bw2, SE); % 对当前图像进行腐蚀
% eroded_img3 = imerode(bw3, SE); % 对当前图像进行腐蚀
% imshow(eroded_img1);
% imshow(eroded_img2);
% imshow(eroded_img3);
SE = [0, 1, 0; 1, 1, 1; 0, 1, 0]; % 定义一个 3x3 的十字型结构元素
[row, col] = size(bw3);
eroded_img = ones(row, col); % 初始化腐蚀后的图像矩阵
for i = 2 : row-1
for j = 2 : col-1
if bw3(i, j) == 0 % 对背景像素进行腐蚀
if sum(sum(bw3(i-1:i+1, j-1:j+1) & SE)) < sum(SE, 'all')
eroded_img(i, j) = 0;
end
end
end
end
imshow(eroded_img);
%对多张图像进行开运算
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
imshow('image1.jpg')
imshow('image2.png')
imshow('image3.png')
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
imshow(I1);
imshow(I2);
imshow(I3);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
bw1 = im2bw(I1,level1);
bw2 = im2bw(I2,level2);
bw3 = im2bw(I3,level3); %图像二值化
imshow(bw1);
imshow(bw2);
imshow(bw3);
for i = 1:3 % 对三张图像进行开运算
img = imread(sprintf('bw%d.png', i)); % 读取当前编号的图像
SE = strel('disk', 3); % 定义一个半径为 3 的圆形结构元素
opened_img = imopen(img, SE); % 对当前图像进行开运算
subplot(3, 2, 2*i-1); imshow(img); title(sprintf('Original Image %d', i)); % 显示原始图像
subplot(3, 2, 2*i); imshow(opened_img); title(sprintf('Opened Image %d', i)); % 显示开运算后的图像
end
%对多张图像进行开运算
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
imshow('image1.jpg')
imshow('image2.png')
imshow('image3.png')
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
imshow(I1);
imshow(I2);
imshow(I3);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
bw1 = im2bw(I1,level1);
bw2 = im2bw(I2,level2);
bw3 = im2bw(I3,level3); %图像二值化
imshow(bw1);
imshow(bw2);
imshow(bw3);
%for i = 1:3 % 对三张图像进行开运算
% img = imread(sprintf('bw%d.png', i)); % 读取当前编号的图像
% SE = strel('disk', 3); % 定义一个半径为 3 的圆形结构元素
% opened_img = imopen(img, SE); % 对当前图像进行开运算
% subplot(3, 2, 2*i-1); imshow(img); title(sprintf('Original Image %d', i)); % 显示原始图像
%subplot(3, 2, 2*i); imshow(opened_img); title(sprintf('Opened Image %d', i)); % 显示开运算后的图像
%end
% 读取多张二值图像
img1 = imread('bw1.png');
img2 = imread('bw2.png');
img3 = imread('bw3.png');
% 定义结构元素
se = strel('disk', 5);
for i=1:3
% 读取二值图像
img = imread(['bw' num2str(i) '.png']);
% 对图像进行闭运算
img_close = imclose(img, se);
% 显示处理后的图像
subplot(3, 2, 2*(i-1)+1); imshow(img); title(['原始图像' num2str(i)]);
subplot(3, 2, 2*i); imshow(img_close); title(['闭运算后的图像' num2str(i)]);
end
%对多张图像进行开运算
%步骤一.图像读取
img1 = imread('image1.jpg');
img2 = imread('image2.png');
img3 = imread('image3.png');
img4 = imread('bw4.jpg');
%步骤二.将彩色图转灰度图像
I1 = rgb2gray(img1);
I2 = rgb2gray(img2);
I3 = rgb2gray(img3);
I4 = rgb2gray(img4);
%步骤三.将灰度图转换为二值化图像
level1 = graythresh(I1); %使用Otsu的方法求阈值
level2 = graythresh(I2);
level3 = graythresh(I3);
level4 = graythresh(I4);
bw1 = im2bw(I1,level1);
bw2 = im2bw(I2,level2);
bw3 = im2bw(I3,level3); %图像二值化
bw4 = im2bw(I4,level4);
% 读取图像
img = imread('bw4.jpg');
% 骨架提取
img_sk = bwmorph(bw4, "skel", Inf);
figure;
subplot(2,2,1); imshow(bw4); title("原始图像");
subplot(2,2,2); imshow(img_sk); title("骨架提取");
% 细化
img_thin = bwmorph(bw4, "thin", Inf);
subplot(2,2,3); imshow(img_thin); title("细化");
% 粗化
img_thick = bwmorph(img_thin, "thick", Inf);
subplot(2,2,4); imshow(img_thick); title("粗化");
调用matlab自带的进行图像腐蚀函数,图像的处理结果如下
不调用matlab自带的进行图像腐蚀函数,图像的处理结果如下
实验二的结果分析与总结:
在本次实验中对调用matlab的腐蚀函数和不调用腐蚀函数对图像的处理结果进行对比,图像腐蚀后与原二值图像进行对比,发现图像腐蚀后与图像膨胀的结果相反,图像变得更清晰,边缘线条变细
实验四的结果分析与总结:
从实验四的结果可以看出:骨架提取后的图像更加细长,提取了原图像中的主要轮廓。
细化后的图像更加细腻,图像细化的主要作用是去除图像中不必要的噪声,提取图像中的主要轮廓,通过图像细化操作,可以将原本较为粗糙的物体轮廓变得更加光滑,去除不必要的锯齿、边缘和孤立的像素点。这样可以更加准确地描述物体的形状和边界。
粗化后的图像更加粗短,与图像细化相反,图像粗化可以将物体轮廓变得更粗,并保留更多的细节信息