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

一、基础知识

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

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

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

二、实验要求

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

三、实验记录

任务1:

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

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)。显示观察处理结果。
体会形态学各个处理操作的作用。

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,设计基于形态学的处理程序,得到你所能达到的最佳处理效果的指纹图像。

% 还没找到合适的结果
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.hqwc.cn/news/460756.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何给闲置电脑安装黑群晖

准备 diskgenius ,黑群晖引导文件(有些需要扩展驱动包),如果给U盘安装需要balenaEtcher或者rufus(U盘安装还需要ChipGenus),如果给硬盘安装需要有pe推荐firePE或U启通 我以U盘为例 首先去找这…

20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理

20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理 2024/2/3 21:23 缘起:最近学习stable-diffusion-webui.git,在Ubuntu20.04.6下配置SD成功。 不搞精简版本:Miniconda了。直接上Anacoda! …

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨,大家好!我是波罗学。 本文是系列文章 Go 技巧第十五篇,系列文章查看:Go 语言技巧。 我们先看这样一个问题:“Go 语言中,将 byte 转换为 int 时是否涉及字节序(endianness)&#x…

前端JavaScript篇之对执行上下文的理解

目录 对执行上下文的理解创建执行上下文 对执行上下文的理解 当我们在执行JavaScript代码时,JavaScript引擎会创建并维护一个执行上下文栈来管理执行上下文。执行上下文有三种类型:全局执行上下文、函数执行上下文和eval函数执行上下文。 在写代码的时…

飞书上传图片

飞书上传图片 1. 概述1.1 访问凭证2. 上传图片获取image_key1. 概述 飞书开发文档上传图片: https://open.feishu.cn/document/server-docs/im-v1/image/create 上传图片接口,支持上传 JPEG、PNG、WEBP、GIF、TIFF、BMP、ICO格式图片。 在请求头上需要获取token(访问凭证) …

停车场|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)

停车场管理系统目录 目录 基于Springboot的停车场管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 (1)车位管理 (2)车位预订管理 (3)公告管理 (4&#…

卷积层Conv1d包含的元素分别是什么,经过卷积层,数据的形状发生变化吗?

nn.Conv1d 是一个一维卷积层,它通常用于处理序列数据,如时间序列或文本数据。这个层包含以下主要元素: 输入通道数(In_channels):这是输入数据的通道数。对于单通道数据(如灰度图像或单变量时间…

第一个 Angular 项目 - 静态页面

第一个 Angular 项目 - 静态页面 之前的笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目,目前因为还没有学到数…

从0开始学Docker ---Docker安装教程

Docker安装教程 本安装教程参考Docker官方文档,地址如下: https://docs.docker.com/engine/install/centos/ 1.卸载旧版 首先如果系统中已经存在旧的Docker,则先卸载: yum remove docker \docker-client \docker-client-latest…

Modern C++ 内存篇1 - allocator

1. 前言 从今天起我们开始内存相关的话题,内存是个很大的话题,一时不知从何说起。内存离不开allocator,我们就从allocator开始吧。allocator目前有两种:std::allocator, std::pmr::polymorphic_allocator,各有优缺点。…

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行,中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制,则程序总是从上往下依次执行,排在前面的代码先执行&#xf…

猫头虎分享已解决Bug || Python Error: NameError: name ‘variable_name‘ is not defined

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …