数字图像处理实验记录九(数字形态学实验)

news/2024/7/21 7:30:00 标签: 计算机视觉, 图像处理, matlab

一、基础知识

1.形态学,用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为有本质的形状特征,如边界连通区域等。
2.膨胀运算:膨胀会使目标区域范围“变大”,将于目标区域接触的背景点合并到该目标物中,使目标边界向外部扩张。作用就是可以用来填补目标区域中某些空洞以及消除包含在目标区域中的小颗粒噪声。
在这里插入图片描述

3.腐蚀运算:腐蚀可以使目标区域范围“变小”,其实质造成图像的边界收缩,可以用来消除小且无意义的目标物。
在这里插入图片描述

4.开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。

二、实验要求

在这里插入图片描述
在这里插入图片描述
1.读入图像1和2,并进行二值化处理(im2bw)。
2.分别选择方形、圆形和菱形结构对图1和图2进行腐蚀(imerode)处理、膨胀(imdilate)处理、开运算(bwmorph)和闭运算(bwmorph)。显示观察处理结果。
体会形态学各个处理操作的作用。
3.针对指纹图像3,设计基于形态学的处理程序,得到你所能达到的最佳处理效果的指纹图像。

三、实验记录

任务1:

读入图像1和2,并进行二值化处理(im2bw)。

matlab">p1 = imread('p1.png');
p2 = imread('p2.png');
hand = imread('hand.png');

p1 = rgb2gray(p1);
p2 = rgb2gray(p2);
hand = rgb2gray(hand);

figure('NumberTitle','off','Name','原图展示');
subplot(1,3,1);imshow(p1);title('图片1');
subplot(1,3,2);imshow(p2);title('图片2');
subplot(1,3,3);imshow(hand);title('指纹图片');

figure('NumberTitle','off','Name','任务一');
I1 = im2bw(p1);
I2 = im2bw(p2);
subplot(1,2,1);imshow(I1);title('二值化后图片1');
subplot(1,2,2);imshow(I2);title('二值化后图片2');
% 生成方形,圆形,菱形结构:
rectangle = strel('rectangle',[5 10]);   % 生成5x10大小的矩形
circle = strel('disk',5);           % 生成半径为5的圆形
square = strel('square',5);         % 生成5x5大小的正方形(也就是菱形)

任务2:

分别选择方形、圆形和菱形结构对图1和图2进行腐蚀(imerode)处理、膨胀(imdilate)处理、开运算(bwmorph)和闭运算(bwmorph)。显示观察处理结果。
体会形态学各个处理操作的作用。

matlab">figure('NumberTitle','off','Name','任务2.1.1 图片1腐蚀');
I1_imerode_retangle = imerode(I1,rectangle);
I1_imerode_circle = imerode(I1,circle);
I1_imerode_square = imerode(I1,square);
subplot(1,3,1);imshow(I1_imerode_retangle);title('图片1方形腐蚀');
subplot(1,3,2);imshow(I1_imerode_circle);title('图片1圆形腐蚀');
subplot(1,3,3);imshow(I1_imerode_square);title('图片1菱形腐蚀');

figure('NumberTitle','off','Name','任务2.1.2 图片1膨胀');
I1_imdilate_retangle = imdilate(I1,rectangle);
I1_imdilate_circle = imdilate(I1,circle);
I1_imdilate_square = imdilate(I1,square);
subplot(1,3,1);imshow(I1_imdilate_retangle);title('图片1方形膨胀');
subplot(1,3,2);imshow(I1_imdilate_circle);title('图片1圆形膨胀');
subplot(1,3,3);imshow(I1_imdilate_square);title('图片1菱形膨胀');

figure('NumberTitle','off','Name','任务2.1.3 图片1开运算');
I1_open_retangle = imopen(I1,rectangle);
I1_open_circle = imopen(I1,circle);
I1_open_square = imopen(I1,square);
subplot(1,3,1);imshow(I1_open_retangle);title('图片1方形开运算');
subplot(1,3,2);imshow(I1_open_circle);title('图片1圆形开运算');
subplot(1,3,3);imshow(I1_open_square);title('图片1菱形开运算');

figure('NumberTitle','off','Name','任务2.1.4 图片1闭运算');
I1_close_retangle = imclose(I1,rectangle);
I1_close_circle = imclose(I1,circle);
I1_close_square = imclose(I1,square);
subplot(1,3,1);imshow(I1_close_retangle);title('图片1方形闭运算');
subplot(1,3,2);imshow(I1_close_circle);title('图片1圆形闭运算');
subplot(1,3,3);imshow(I1_close_square);title('图片1菱形闭运算');



figure('NumberTitle','off','Name','任务2.2.1 图片2腐蚀');
I2_imerode_retangle = imerode(I2,rectangle);
I2_imerode_circle = imerode(I2,circle);
I2_imerode_square = imerode(I2,square);
subplot(1,3,1);imshow(I2_imerode_retangle);title('图片2方形腐蚀');
subplot(1,3,2);imshow(I2_imerode_circle);title('图片2圆形腐蚀');
subplot(1,3,3);imshow(I2_imerode_square);title('图片2菱形腐蚀');

figure('NumberTitle','off','Name','任务2.2.2 图片2膨胀');
I2_imdilate_retangle = imdilate(I2,rectangle);
I2_imdilate_circle = imdilate(I2,circle);
I2_imdilate_square = imdilate(I2,square);
subplot(1,3,1);imshow(I2_imdilate_retangle);title('图片2方形膨胀');
subplot(1,3,2);imshow(I2_imdilate_circle);title('图片2圆形膨胀');
subplot(1,3,3);imshow(I2_imdilate_square);title('图片2菱形膨胀');

figure('NumberTitle','off','Name','任务2.2.3 图片2开运算');
I2_open_retangle = imopen(I2,rectangle);
I2_open_circle = imopen(I2,circle);
I2_open_square = imopen(I2,square);
subplot(1,3,1);imshow(I2_open_retangle);title('图片2方形开运算');
subplot(1,3,2);imshow(I2_open_circle);title('图片2圆形开运算');
subplot(1,3,3);imshow(I2_open_square);title('图片2菱形开运算');

figure('NumberTitle','off','Name','任务2.2.4 图片2闭运算');
I2_close_retangle = imclose(I2,rectangle);
I2_close_circle = imclose(I2,circle);
I2_close_square = imclose(I2,square);
subplot(1,3,1);imshow(I2_close_retangle);title('图片2方形闭运算');
subplot(1,3,2);imshow(I2_close_circle);title('图片2圆形闭运算');
subplot(1,3,3);imshow(I2_close_square);title('图片2菱形闭运算');

任务3:

针对指纹图像3,设计基于形态学的处理程序,得到你所能达到的最佳处理效果的指纹图像。

matlab">% 还没找到合适的结果
figure('NumberTitle','off','Name','任务3.1 原图');
hand1 = hand;
imshow(hand1);
figure('NumberTitle','off','Name','任务3.2 处理后');
square = strel('square',9);
circle = strel('disk',2); 

hand = imerode(hand,circle);
hand = imerode(hand,circle);

circle1 = strel('disk',1); 
hand = imerode(hand,circle1);
circle3 = strel('disk',3); 
circle2 = strel('disk',2);
square1 = strel('square',1);
square2 = strel('square',2);
square4 = strel('square',4);
rectangle1_5 = strel('rectangle',[1 5]);
rectangle2_5 = strel('rectangle',[2 5]);
rectangle5_1 = strel('rectangle',[5 1]);
rectangle1_10 = strel('rectangle',[1 12]);
rectangle2_10 = strel('rectangle',[2 15]);
rectangle2_3 = strel('rectangle',[2 1]);
% hand = imdilate(hand,circle3);
hand = imdilate(hand,rectangle1_10);
hand = imdilate(hand,rectangle2_3);
hand = imdilate(hand,circle1);
% hand = imdilate(hand,square2);
% hand = imdilate(hand,circle2);
% rectangle3_1 = strel('rectangle',[3 1]);
% hand = imdilate(hand,rectangle3_1);
% hand = imdilate(hand,square1);
% hand = imdilate(hand,square1);
% hand = bwmorph(hand,'open');
% hand2 = imopen(hand,circle);
% hand3 = bwmorph(hand,'open');
% hand2 = imopen(hand,circle);
% circle = strel('disk',2); 
% hand3 = imclose(hand2,circle);
% hand2 = bwmorph(hand2,'remove');

imshow(hand)

四、实验结果

任务1:

读入图像1和2,并进行二值化处理(im2bw)。
在这里插入图片描述
在这里插入图片描述

任务2:

分别选择方形、圆形和菱形结构对图1和图2进行腐蚀(imerode)处理、膨胀(imdilate)处理、开运算(bwmorph)和闭运算(bwmorph)。显示观察处理结果。
体会形态学各个处理操作的作用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

任务3:

针对指纹图像3,设计基于形态学的处理程序,得到你所能达到的最佳处理效果的指纹图像。
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5370387.html

相关文章

cmd卸载软件

如果使用的是Win 10,并且需要在磁盘内释放一些空间,可以直接在命令提示符里卸载不再使用的应用程序,和小编一起来看看详细的步骤吧。 步骤如下: 以管理员身份运行命令提示符来卸载程序。在Windows搜索框中,键入“ cm…

IP地址查询的应用与意义

在数字化时代,IP地址已成为连接我们与网络世界的纽带之一。通过IP地址查询,我们可以揭开数字世界的面纱,了解更多有关网站、用户和网络活动的信息。本文将探讨IP地址查询的应用场景、意义以及其在网络安全、个人隐私保护和地理定位服务中的作…

react将选中文本自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…

mybatis-plus循环处理多个条件的 or 查询

我们一般用 mybatis-plus 的提供的 api 接口处理 List、Set 作为条件查询的时候&#xff0c;都会使用 in&#xff0c;例如 &#xff08;Student 类省略 没啥好些的&#xff09;&#xff1a; LambdaQueryWrapper<Student> queryWrapper new QueryWrapper<Student>…

每日一题——LeetCode1422.分割字符串的最大得分

方法一 暴力枚举 枚举所有分割点的情况&#xff0c;取最大得分 var maxScore function(s) {let res 0;const n s.length;for (let i 1; i < n; i) {let score 0;for (let j 0; j < i; j) {if (s[j] 0) {score;}}for (let j i; j < n; j) {if (s[j] 1) {sco…

Hive与Presto中的列转行区别

Hive与Presto列转行的区别 1、背景描述2、Hive/Spark列转行3、Presto列转行 1、背景描述 在处理数据时&#xff0c;我们经常会遇到一个字段存储多个值&#xff0c;这时需要把一行数据转换为多行数据&#xff0c;形成标准的结构化数据 例如&#xff0c;将下面的两列数据并列转换…

leetcode13罗马数字转整数|算法详细讲解与分析

题目 13. 罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

嵌入式系统中的故障容错和恢复机制有哪些常用的方法和技术?

嵌入式系统是一种在特定应用领域内运行的计算机系统&#xff0c;其对系统可靠性和稳定性有着较高的要求。在嵌入式系统中&#xff0c;故障容错和恢复机制是至关重要的&#xff0c;因为它们能够确保系统在面临故障和异常情况时能够继续正常工作或者快速恢复正常状态。本文将介绍…