matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化

一.实验目的

1.对多张二值图像进行膨胀、腐蚀、观察并分析说明图像变化
2.对多张二值图像进行开运算、闭运算、观察并分析说明图像变化
3.使用bwmorph函数对图像进行骨架提取、细化、粗化运算,观察并分析说明图像变化。

二.实验原理

图像膨胀是指对二值图像中的点(像素)进行膨胀操作,即将图像中较小的暗色区域消除,使其与周围亮色区域合并成为一块更大的区域。其基本原理是使用一个结构元素对待膨胀图像进行扫描,将当前结构元素与原始图像进行融合,取结构元素内像素值的最大值作为结果输出。最终输出的结果图像像素值更加平滑且具有连续性,相当于在图像中“填充”了一些空洞和细节,使得图像看起来更加的完整。


图像腐蚀主要作用是将二值图像中较小的亮色区域消除,使得图像中的边界细节更加清晰和明显。其基本原理是使用一个结构元素对待腐蚀图像进行扫描,将当前结构元素与原始图像进行滑动,取结构元素内像素值的最小值作为结果输出。最终输出的结果图像像素值更加集中和凝聚,可以去除小的局部细节使得图像更清晰,但是图像的连续性会受到破坏
开运算和闭运算是数字图像处理中经常使用的两种形态学操作。它们都可以通过图像膨胀和腐蚀操作来实现,并且经常通过这两种操作的组合来完成图像预处理、分割以及去除噪声等任务。


开运算和闭运算的基本概念:

开运算:先对图像进行腐蚀操作,再进行膨胀操作。其作用是去除图像中小且不规则的亮度区域,使得边界更加平滑,这样有助于去除孤立的小噪声点、断裂和细节。
闭运算:先对图像进行膨胀操作,再进行腐蚀操作。其作用是使得超过结构元素大小的区域被连接和填充,有助于消除图像中的小孔洞和断裂


bwmorph是MATLAB中的一个常用函数,用于对二值图像进行形态学变换。该函数可用于实现诸如膨胀、腐蚀、开运算、闭运算、骨架化等操作。其语法为:
BW2 = bwmorph(BW,operation,n)
其中,BW是待变换的二值图像,operation是指定的变换名称,n是描述该变换的附加参数。

三.实验内容及步骤

1.对多张二值图像进行膨胀

调用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);

2.对多张二值图像进行腐蚀

调用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);

3.对多张二值图进行开运算、闭运算

1.开运算
%对多张图像进行开运算
%步骤一.图像读取
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

2.闭运算
%对多张图像进行开运算
%步骤一.图像读取
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

4.使用bwmorph函数对图像进行骨架提取、细化、粗化运算,观察并分析说明图像变化

%对多张图像进行开运算
%步骤一.图像读取
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("粗化");

实验结果及分析

1.图像膨胀实验结果

  • 三张原图
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第1张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第2张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第3张图片

2.灰度化图像

matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第4张图片
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第5张图片
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第6张图片

  • 二值化图像
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第7张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第8张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第9张图片
  • 二值化图像(调用matlab的dilate函数实现)
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第10张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第11张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第12张图片
  • 二值化图像(不调用dilate函数实现
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第13张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第14张图片
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第15张图片
    实验一的结果分析与总结:
    在本次实验中对调用matlab的膨胀函数和不调用膨胀函数对图像的处理结果进行对比,图像膨胀后与原二值图像进行对比,发现图像膨胀后图像变得更模糊,边缘线条变粗,且自行实现的图像膨胀与matlab自带的dilate函数进行处理的结果几乎一致。

2.图像腐蚀结果如下

调用matlab自带的进行图像腐蚀函数,图像的处理结果如下
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第16张图片
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第17张图片
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第18张图片
不调用matlab自带的进行图像腐蚀函数,图像的处理结果如下
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第19张图片
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第20张图片
matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第21张图片
实验二的结果分析与总结:
在本次实验中对调用matlab的腐蚀函数和不调用腐蚀函数对图像的处理结果进行对比,图像腐蚀后与原二值图像进行对比,发现图像腐蚀后与图像膨胀的结果相反,图像变得更清晰,边缘线条变细


3.对二值图像进行开闭运算

  • 开运算结果
  • matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第22张图片
  • 闭运算结果
    matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第23张图片
    实验三的结果分析与总结:
    从实验三的结果可以看出:开运算是指先进行腐蚀操作,再进行膨胀操作。开运算可以用于去除二值图像中的小物体或小噪点。
    闭运算是先使用膨胀操作,再使用腐蚀操作。它可以用于二值图像的图像增强和去除图像中的噪声

4.骨架相关实验结果

matlab图像形态学运算-膨胀,腐蚀,开闭运算,骨架提取细化_第24张图片
实验四的结果分析与总结:
从实验四的结果可以看出:骨架提取后的图像更加细长,提取了原图像中的主要轮廓。
细化后的图像更加细腻,图像细化的主要作用是去除图像中不必要的噪声,提取图像中的主要轮廓,通过图像细化操作,可以将原本较为粗糙的物体轮廓变得更加光滑,去除不必要的锯齿、边缘和孤立的像素点。这样可以更加准确地描述物体的形状和边界。
粗化后的图像更加粗短,与图像细化相反,图像粗化可以将物体轮廓变得更粗,并保留更多的细节信息

你可能感兴趣的:(樱花大的作业,matlab,计算机视觉,人工智能,图像处理)