计算机视觉实验一:图像基础处理

1. 图像的直方图均衡

1.1 实验目的与要求

(1)理解直方图均衡的原理与作用;

(2)掌握统计图像直方图的方法;

(3)掌握图像直方图均衡的方法。

1.2 实验原理及知识点

        直方图均衡化是通过灰度变换将一幅图象转换为另一幅均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。直方图均衡的缺点是:1、变换后图像的灰度级减少,某些细节消失;2、某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。

1.3 实验仪器与软件

(1) PC计算机

(2) MatLab或opencv 

(3) 实验所需要的图片 (注意: 示例代码中的如 rice.png,pout.tif 等图片一般可以直接使用不需要准备,这些图片是安装matlab后就有的示例图片,如果读不了可以尝试修改一下文件名的后缀,如.png,.jpg或者.tif,也可以在本报告中另存图片在工作目录上)

1.4 实验报告要求

描述实验的基本步骤,用数据和图片给出各个步骤中取得的实验结果和源代码,并进行必要的讨论,必须包括原始图像及其计算/处理后的图像。

1.5 实验内容及步骤

(1) 直方图显示

 读入图像‘rice.png’,在一个窗口中显示灰度级n=64,128和256的图像直方图。

% 读入图像
image = imread('rice.png');
% 显示灰度级为64的直方图
subplot(3,1,1);
imhist(image, 64);
title('Histogram with 64 Gray Levels');
% 显示灰度级为128的直方图
subplot(3,1,2);
imhist(image, 128);
title('Histogram with 128 Gray Levels');
% 显示灰度级为256的直方图
subplot(3,1,3);
imhist(image, 256);
title('Histogram with 256 Gray Levels');

(2)直方图灰度调节

利用函数imadjust调解图像灰度范围,观察变换后的图像及其直方图的变化。

% 读入图像
image = imread('rice.png');
% 对图像进行灰度范围调节
adjusted_image = imadjust(image);
% 显示原图像
subplot(2,2,1);
imshow(image);
title('Original Image');
% 显示原图像的直方图
subplot(2,2,2);
imhist(image);
title('Original Histogram');
% 显示调节后的图像
subplot(2,2,3);
imshow(adjusted_image);
title('Adjusted Image');
% 显示调节后的图像的直方图
subplot(2,2,4);
imhist(adjusted_image);
title('Adjusted Histogram');

 (3)直方图均衡化

分别对图像‘pout.tif’和‘tire.tif’进行直方图均衡化处理,比较处理前后图像及直方图分布的变化。

% 读入图像1
image1 = imread('pout.tif');

% 读入图像2
image2 = imread('tire.tif');

% 对图像1进行直方图均衡化
equalized_image1 = histeq(image1);

% 对图像2进行直方图均衡化
equalized_image2 = histeq(image2);

% 显示处理前的图像和直方图
subplot(2,4,1);
imshow(image1);
title('Original Image 1');

subplot(2,4,2);
imhist(image1);
title('Original Histogram 1');

subplot(2,4,5);
imshow(image2);
title('Original Image 2');

subplot(2,4,6);
imhist(image2);
title('Original Histogram 2');

% 显示处理后的图像和直方图
subplot(2,4,3);
imshow(equalized_image1);
title('Equalized Image 1');

subplot(2,4,4);
imhist(equalized_image1);
title('Equalized Histogram 1');

subplot(2,4,7);
imshow(equalized_image2);
title('Equalized Image 2');

subplot(2,4,8);
imhist(equalized_image2);
title('Equalized Histogram 2');

(4)读取一幅彩色图像(图片自己准备),对RGB图像的每个通道进行直方图均衡化,对均衡化后进行重新合并成彩色图像,展示不同阶段的图像效果。另将RGB图像转换为HSV图像(rgb2hsv函数),分别对三分量的图像行直方图均衡化,最后合并成新的彩色图像,分析不同阶段的图像效果。

% 读入彩色图像
rgb_image = imread('你的图片文件路径');

% 对RGB图像的每个通道进行直方图均衡化
equalized_R = histeq(rgb_image(:,:,1));
equalized_G = histeq(rgb_image(:,:,2));
equalized_B = histeq(rgb_image(:,:,3));

% 合并三个通道成彩色图像
equalized_rgb_image = cat(3, equalized_R, equalized_G, equalized_B);

% 显示不同阶段的图像效果
subplot(2,3,1);
imshow(rgb_image);
title('Original RGB Image');

subplot(2,3,2);
imshow(equalized_R);
title('Equalized Red Channel');

subplot(2,3,3);
imshow(equalized_G);
title('Equalized Green Channel');

subplot(2,3,4);
imshow(equalized_B);
title('Equalized Blue Channel');

subplot(2,3,5);
imshow(equalized_rgb_image);
title('Equalized RGB Image');

% 将RGB图像转换为HSV图像
hsv_image = rgb2hsv(rgb_image);

% 分别对HSV图像的三分量进行直方图均衡化
equalized_h = histeq(hsv_image(:,:,1));
equalized_s = histeq(hsv_image(:,:,2));
equalized_v = histeq(hsv_image(:,:,3));

% 合并三个通道成新的彩色图像
equalized_hsv_image = cat(3, equalized_h, equalized_s, equalized_v);

% 转回RGB图像
equalized_rgb_from_hsv = hsv2rgb(equalized_hsv_image);

% 显示不同阶段的图像效果
figure;
subplot(1,2,1);
imshow(equalized_rgb_image);
title('Equalized RGB Image');

subplot(1,2,2);
imshow(equalized_rgb_from_hsv);
title('Equalized RGB Image from HSV');

(5)自行设计程序实现图像的直方图均衡(选做,即不使用matlab或其它库内的相关函数实现)。

选做就是不做

2. 图像的形态学操作

2.1 实验目的与要求

目的:学习常见的数学形态学运算基本方法,了解腐蚀、膨胀、开运算、闭运算取得的效果,培养处理实际图像的能力。

2.2 实验原理及知识点

数学形态学是一种基于形状的图像处理理论和方法,数学形态学图像处理的基本思想是选择具有一定尺寸和形状的结构元素,并提取图像中相关形状结构的图像分量,以达到对图像分析和识别的目的。

膨胀和腐蚀是数学形态学图像处理的两个基本运算,其他数学形态学运算或算法均是以这两种基本运算为基础。二值图像形态学的基本运算包括膨胀、腐蚀、开运算、闭运算和击中击不中运算。在基本运算的基础上设计了多种二值形态学的实用算法,例如,去噪、边界提取、孔洞填充、连通分量的提取、骨架、凸包、细化、粗化、剪枝。灰度形态学的基本运算包括灰度膨胀、灰度腐蚀、灰度的开运算和闭运算,在基本的运算的基础上,灰度图像形态学的主要算法有顶帽变换、底帽变换和灰度形态学重构。数学形态学算法具有利于并行实现的结构,适合于并行操作,且硬件上容易实现。

在二值图像形态学中,结构元素是一个由0值和1值组成的矩阵。每一个结构元素有一个原点,结构元素中的原点指定待处理像素的位置。结构元素中的1值定义了结构元素的邻域,输出图像中对应原点的值建立在输入图像中相应像素及其邻域像素比较的基础上。在以下操作中,设Α表示二值图像,B表示结构元素,使用结构元素B对二值图像A进行操作。

2.2.1 膨胀

膨胀是将与物体接触的所有背景点合并到该物体中,使边界外部向外扩张的过程。通过膨胀,可以填充图像中的小孔及在图像边缘外的小凹陷部分。

2.2.2 腐蚀

腐蚀和膨胀是对偶操作。腐蚀是移除图像中目标边界的像素,使边界向内部收缩的过程。利用腐蚀操作,可以消除小且无意义的物体。

2.2.3 开运算

2.2.4 闭运算

2.3 实验仪器与软件

(1) PC计算机

(2) MatLab或opencv 

(3) 实验所需要的图片

2.4 实验报告要求

描述实验的基本步骤,用数据和图片给出各个步骤中取得的实验结果和源代码,并进行必要的讨论,必须包括原始图像及其计算/处理后的图像。

2.5 实验内容及步骤

(1)图像膨胀

a)对包含矩形对象的二进制图像进行膨胀操作。

BW=zeros(9,10);
BW(4:6,4:7)=1;
imshow(BW,'notruesize')
se=strel('square',3); 		
BW2=imdilate(BW,se);
figure,imshow(BW2,'notruesize')

 b)改变上述结构元素类型(如:line, diamond, disk等),重新进行膨胀操作。

Line: BW=zeros(9,10);
BW(4:6,4:7)=1;
imshow(BW,'notruesize')
se=strel('line',3,3); 		
BW2=imdilate(BW,se);
figure,imshow(BW2,'notruesize')

(2)图像腐蚀  

a) 对图像‘circbw.tif’(系统自带图像可以直接读取)进行腐蚀操作。

BW1=imread('circbw.tif');
se=strel('arbitrary',eye(5));
BW2=imerode(BW1,se);
imshow(BW1)
figure,imshow(BW2)

b) 对图像‘text.tif’进行腐蚀操作。我的MATLAB没有自带text.tif,我换成了其他

BW=imread('text.tif');
se=strel('line',11,90);
BW2=imerode(BW3,se);
imshow(BW)
figure,imshow(BW2)

(3)膨胀与腐蚀的综合使用

a) 从原始图像‘circbw.tif’中删除电流线,仅保留芯片对象。

方法一:先腐蚀(imerode),再膨胀(imdilate);

BW1=imread('circbw.tif');
imshow(BW1)
se=strel('rectangle',[40 30]); 	%选择适当大小的矩形结构元素
BW2=imerode(BW1,se);   		%先腐蚀,删除较细的直线
figure,imshow(BW2)
BW3=imdilate(BW2,se);  		%再膨胀,恢复矩形的大小
figure,imshow(BW3)

方法二:使用形态开启函数(imopen)。

BW1=imread('circbw.tif');
imshow(BW1)
se=strel('rectangle',[30,20]); 
BW2=imopen(BW1,se);     		%开启操作
figure,imshow(BW2)

b)改变结构元素的大小,重新进行开启操作,观察处理结果。

se=strel(‘rectangle’,[20 10]);
se=strel(‘rectangle’,[50 40]);

c)置结构元素大小为[4 3],同时观察形态开启(imopen)与闭合(imclose)的效果,总结形态开启与闭合在图像处理中的作用。

I=imread('circbw.tif');
imshow(I)
se=strel('rectangle',[4 3]); 
I1=imopen(I,se);     		%开启操作
I2=imclose(I,se);    			%闭合操作
figure,imshow(I1)
figure,imshow(I2)

(4)利用数学形态学函数bwmorph(BW,'skel',Inf),对下面二值图像的目标提取骨架,并分析骨架结构。其中,BW表示二值图像。

图片自提:计算机视觉实验一:图像基础处理资源-CSDN文库

% 读入二值图像(替换'your_binary_image.png'为实际图像文件名)
BW = imread('your_binary_image.png');

% 提取骨架
skeleton = bwmorph(BW, 'skel', Inf);

% 显示原始图像和骨架
figure;
subplot(1, 2, 1);
imshow(BW);
title('Original Binary Image');

subplot(1, 2, 2);
imshow(skeleton);
title('Skeleton');

% 分析骨架结构
% 可以进行一些骨架结构分析,如检测骨架中的交叉点和端点。
% 以下是一个示例来检测和可视化骨架的交叉点和端点:

% 检测骨架的交叉点
branchpoints = bwmorph(skeleton, 'branchpoints');

% 检测骨架的端点
endpoints = bwmorph(skeleton, 'endpoints');

% 可视化交叉点和端点
[r_branch, c_branch] = find(branchpoints);
[r_end, c_end] = find(endpoints);

% 显示骨架,交叉点和端点
figure;
imshow(skeleton);
hold on;

% 交叉点用红色表示
plot(c_branch, r_branch, 'ro', 'MarkerSize', 10);

% 端点用蓝色表示
plot(c_end, r_end, 'bo', 'MarkerSize', 10);

title('Skeleton with Branchpoints and Endpoints');

 3.实验参考图像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第8章 利用CSS制作导航菜单作业

1.利用CSS技术&#xff0c;结合链接和列表&#xff0c;设计并实现“山水之间”页面。 浏览效果如下&#xff1a; HTML代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>山水之间</title><…

dhcp池没有空闲ip导致手机无法获得ip

得到用户反馈&#xff0c;一个高速项目部的wifi无法接入&#xff0c;让排查原因。 反馈有的手机能接入&#xff0c;有的接入不了。查看ac界面发现有个终端获得的ip是169.254.xxx.xxx。 ip地址是169.254.96.17显然是手机打开wlan开关后&#xff0c;鉴权通过后dhcp过程&#xff0…

AJAX和JSON

一.AJAX技术 1.1 AJAX介绍 Ajax 即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c;是指一种创建 交互式、快速动态应用的网页开发技术&#xff0c;无需重新加载整个网 页的情况下&#xff0c;能够更新页面局部数据的技术。 通…

c++包装器/适配器 function--通俗易懂

1.为什么要有function 在下面的场景下 useF类模版要实例化出三份&#xff0c;影响效率 仿函数:c仿函数--通俗易懂-CSDN博客 lambda表达式&#xff1a;c lambda表达式--通俗易懂-CSDN博客 template<class F, class T> T useF(F f, T x) {static int count 0;cout <…

项目模块十五:HttpResponse模块

一、模块设计思路 存储HTTP应答要素&#xff0c;提供简单接口 二、成员变量 int _status; // 应答状态码 unordered_map<string, string> _headers; // 报头字段 string _body; // 应答正文 bool _redirect_flag; // 是否重定向信息 stri…

【sqlmap使用】

sqlmap简介 sqlmap 目录结构 sqlmap常用参数 sqlmap实现注入 测试注入点&#xff0c;检测到注入点后&#xff0c;直接爆数据库名 python sqlmap.py –u http://172.16.12.2/7/9/strsql.php --data "usernameadmin" --dbs注意sqlmap在使用过程中可能会出现几个需要…

Java已死,大模型才是未来?

作者&#xff1a;不惑_ 引言 在数字技术的浪潮中&#xff0c;编程语言始终扮演着至关重要的角色。Java&#xff0c;自1995年诞生以来&#xff0c;便以其跨平台的特性和丰富的生态系统&#xff0c;成为了全球范围内开发者们最为青睐的编程语言之一 然而&#xff0c;随着技术的…

Rust 力扣 - 59. 螺旋矩阵 II

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 使用一个全局变量current记录当前遍历到的元素的值 我们只需要一圈一圈的从外向内遍历矩阵&#xff0c;每一圈遍历顺序为上边、右边、下边、左边&#xff0c;每遍历完一个元素后current 我们需要注意的是如果上…

MFC工控项目实例二十八模拟量信号每秒采集100次

用两个多媒体定时器&#xff0c;一个定时0.1秒计时&#xff0c;另一个定时0.01秒用来对模拟量信号采集每秒100次。 1、在SEAL_PRESSUREDlg.h中添加代码 class CSEAL_PRESSUREDlg : public CDialo { public:CSEAL_PRESSUREDlg(CWnd* pParent NULL); // standard constructor&a…

用插值公式实现滚动进度条动画效果

我们在日常前端开发时在动画的选择上基本都是css&#xff0c;通过css的animation即可满足大部分的开发场景&#xff0c;如果遇到了特殊而比较不容易实现的效果就会考虑到用js来实现&#xff0c;而本次的主题&#xff0c;就是围绕用js来做一个比较不常见的特殊动画效果。 假设我…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录逻辑代码

24.11.03 1.输入手机号跳转功能 第一个要设计的功能是&#xff0c;输入手机号以后跳转到另一个页面&#xff0c;输入获取得到的验证码页面。先拿这个功能练练手。 首先看一下此时的完整项目结构&#xff1a; 主要是添加了2个活动类和对应的界面&#xff0c;下面看详细的代码…

ubuntu【桌面】 配置NAT模式固定IP

DHCP分配导致虚拟机IP老变&#xff0c;SSH老要重新配置&#xff0c;设成静态方便些 一、设NAT模式 1、设为NAT模式 2、看模式对应的虚拟网卡 - VMnet8 3、共享主机网卡网络到虚拟网卡 - VMnet8 二、为虚拟网卡设置静态IP 记住这个IP 三、设置ubuntu固定IP 1、关闭DHCP并…

数智驱动,纷享销客助力万东医疗实现精细化管理

数字化浪潮正在席卷整个医疗影像行业&#xff0c;数字化工具对疾病诊疗效率和诊疗质量的提升也有目共睹。北京万东医疗科技股份有限公司&#xff08;以下简称“万东医疗”&#xff0c;股票代码 600055&#xff09;成立于1955年&#xff0c;1997 年在上海证交所上市&#xff0c;…

项目模块十四:HttpRequest模块

一、项目设计思路 存储HTTP请求要素&#xff0c;提供简单接口 二、成员变量 全部公有 string _method; // 请求方法 string _path; // 资源路径 string _version; // 协议版本 string _body; // 请求正文 smatch _matches; // 资源路径正则提取 …

[HNCTF 2022 Week1]calc_jail_beginner_level3(JAIL)

开启靶场&#xff0c;打开链接&#xff0c;下载附件&#xff1a; 嗯&#xff0c;直接显示“Oh hacker!”&#xff0c;有点懵&#xff0c;先看看下载的附件&#xff08;server.py&#xff09;&#xff1a; 得到信息如下&#xff1a; 用户输入的表达式长度被限制在7个字符以内。…

最短路的求解

实验类型&#xff1a;◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的&#xff1a;学会使用Matlab求解最短路。 实验内容&#xff1a;1.熟练运用Floyd算法&#xff1b;2. 熟练运用Dijkstra算法&#xff1b;3.利用Matlab编程实现最短路的计算。 例1&#xff1a;已知无向图…

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8 1、.NET Reactor V6.9.8 功能简介2、官方下载 1、.NET Reactor V6.9.8 功能简介 业界领先的源代码保护 .NET Reactor通过多种方法来防止反编译&#xff0c;这些方法会将 .NET 程序集转换为任何现有工具都无法反编译的进程。…

为啥学习数据结构和算法

基础知识就像是一座大楼的地基&#xff0c;它决定了我们的技术高度。而要想快速做出点事情&#xff0c;前提条件一定是基础能力过硬&#xff0c;“内功”要到位。 想要通关大厂面试&#xff0c;千万别让数据结构和算法拖了后腿 我们学任何知识都是为了“用”的&#xff0c;是为…

Ubuntu 24.04上启用 root 用户通过 SSH 和图形界面进行登录

一、启用 root 用户的密码登录 设置 root 用户密码&#xff1a; 在终端中输入以下命令为 root 用户设置一个密码&#xff1a; testtest-virtual-machine:~$ sudo passwd root [sudo] test 的密码&#xff1a; 新的密码&#xff1a; 无效的密码&#xff1a; 密码是一个回文…

卡尔曼滤波器-Kalmen Filter-1

卡尔曼滤波器是一种最优递归数据处理算法&#xff0c;它更像是一种观测器&#xff0c;而不是一般意义上的滤波器。卡曼滤波器的应用非常广泛&#xff0c;尤其是在导航当中。它的广泛应用是因为我们生活的世界中存在着大量的不确定性&#xff0c;当我们去描述一个系统的时候&…