当前位置: 首页 > news >正文

实验三 图像增强—灰度变换

一、实验目的:

1、了解图像增强的目的及意义,加深对图像增强的感性认识,巩固所学理论知识。

2、学会对图像直方图的分析。

3、掌握直接灰度变换的图像增强方法。

二、实验原理及知识点

术语‘空间域’指的是图像平面本身,在空间域内处理图像的方法是直接对图像的像素进行处理。空间域处理方法分为两种:灰度级变换、空间滤波。空间域技术直接对像素进行操作其表达式为

                                                                 g(x,y)=T[f(x,y)]

其中f(x,y)为输入图像,g(x,y)为输出图像,T是对图像f进行处理的操作符,定义在点(x,y)的指定领域内。

定义点(x,y)的空间邻近区域的主要方法是,使用中心位于(x,y)的正方形或长方形区域。此区域的中心从原点(如左上角)开始逐像素点移动,在移动的同时,该区域会包含不同的邻域。T应用于每个位置(x,y),以便在该位置得到输出图像g。在计算(x,y)处的g值时,只使用该邻域的像素。

灰度变换T的最简单形式是使用大小为1×1的邻域,此时,(x,y)处的g值仅由f在该点处的亮度决定,T也变为一个亮度或灰度级变化函数。当处理单设(灰度)图像时,这两个术语可以互换。由于亮度变换函数仅取决于亮度的值,而与(x,y)无关,所以亮度函数通常可写做如下所示的简单形式:

                                                                          s=T(r)

其中,r表示图像f中相应点(x,y)的亮度,s表示图像g中相应点(x,y)的亮度。

2.1灰度变换函数

重点使用imadjuststretchlim函数

q=imadjust(I, [low_in; high_in], [low_out; high_out], gamma)

python的基本实现https://stackoverflow.com/questions/39767612/what-is-the-equivalent-of-matlabs-imadjust-in-python

stretchlim在matlab原型如下:

Low_High = stretchlim(f, tol)

其中f是一张灰度图片,tol如果是一个两元素向量[low_frac high_frac],指定了图像低和高像素的饱和度百分比,tol如果是一个标量,那么

low_frac = tol, high_frac = 1 - low_frac。

tol默认值是[0.01 0.99]。简单的说,就是计算两个阈值,(默认情况)其中low代表小于这个值的像素占整张图片的1%,其中high代表大于这个值的像素占整张图片的1-0.99=1%。

如果选择tol=0,low_frac=[min(f(:)) max(f(:))] 。

通常利用stretchlim配合imadjust来自动地提高图片的对比度,而不关心参数高低的处理

2.2对数及对比度扩展

三、实验内容(不限编程语言、也可自行选择实验图像):

(1)灰度变换imadjust、intrans函数和stretchlim函数的使用。

对数变化mat2gray函数的使用,例如:

1、图像数据读出

2、计算并分析图像直方图

3、利用直接灰度变换法对图像进行灰度变换

下面给出灰度变化的MATLAB程序

f=imread('medicine_pic.jpg');%或者选lenna.jpgg=imhist(f,256);            %显示其直方图g1=imadjust(f,[0 1],[1 0]);    %灰度转换,实现明暗转换(负片图像)figure,imshow(g1)

%将0.5到0.75的灰度级扩展到范围[0 1]g2=imadjust(f,[0.5 0.75],[0 1]);figure,imshow(g2)g=imread('point.jpg');h=log(1+double(g));    %对输入图像对数映射变换h=mat2gray(h);         %将矩阵h转换为灰度图片h=im2uint8(h);         %将灰度图转换为8位图figure,imshow(h)

(2)图像的几何变换(图像的缩放)、旋转、镜像变换

旋转函数(思考并实现镜像变换。所谓的镜像,通俗地讲,是指在镜子中所成的像。其特点是左右颠倒或者是上下颠倒。镜像分为水平镜像和垂直镜像。)

B = imrotate(A,angle)B = imrotate(A,angle,method)B = imrotate(A,angle,method,bbox)示例:img_w = 640;img_h = img_w;img_oblique_rect = zeros(img_h, img_w);% create a oblique(45) rectangle in the matrixx1 = int32(img_w / 5 * 2); x2 = int32(img_w / 5 * 3);y1 = int32(img_h / 7); y2 = int32(img_h / 7 * 6);% 下面这句代码产生一个常规矩形。img_oblique_rect(y1:y2, x1:x2) = 1;% 利用双线性插值算法对图像进行旋转, 产生一个斜矩形img_oblique_rect=imrotate(img_oblique_rect,45,'bilinear','crop');img_oblique_rect = imcomplement(img_oblique_rect);figure('Name', '这是一个斜矩形'), imshow(img_oblique_rect)

三.实验程序、实验结果与实验分析

1. 实验程序

(1)灰度变换imadjust、intrans函数和stretchlim函数的使用

f=imread('medicine_pic.jpg');%或者选lenna.jpgimhist(f,256);          %显示其直方图g1=imadjust(f,[0 1],[1 0]);    %灰度转换,实现明暗转换(负片图像)figure,imshow(g1),title('负片图像');%将0.5到0.75的灰度级扩展到范围[0 1]g2=imadjust(f,[0.5 0.75],[0 1]);figure, imshow(g2), title('灰度级扩展后的图像');g=imread('point.jpg');h=log(1+double(g));    %对输入图像对数映射变换h=mat2gray(h);         %将矩阵h转换为灰度图片h=im2uint8(h);         %将灰度图转换为8位图figure,imshow(h),title('对数映射变换图像');

(2)图像的几何变换(图像的缩放)、旋转、镜像变换

I=imread('Cameraman.tif');figure,imshow(I),title('原始图像');scale=0.5;J=imresize(I,scale);figure,imshow(J),title('图像缩小为原始大小一半的图像');img_w = 640;img_h = img_w;img_oblique_rect = zeros(img_h, img_w);% create a oblique(45) rectangle in the matrixx1 = int32(img_w / 5 * 2); x2 = int32(img_w / 5 * 3);y1 = int32(img_h / 7); y2 = int32(img_h / 7 * 6);% 下面这句代码产生一个常规矩形。img_oblique_rect(y1:y2, x1:x2) = 1;imshow(img_oblique_rect),title('常规矩形');% 利用双线性插值算法对图像进行旋转, 产生一个斜矩形img_oblique_rect=imrotate(img_oblique_rect,45,'bilinear','crop');img_oblique_rect = imcomplement(img_oblique_rect);figure('Name', '这是一个斜矩形'), imshow(img_oblique_rect),title('斜矩形');

2. 实验结果

(1)灰度变换imadjust、intrans函数和stretchlim函数的使用(Test3_1)

①图像medicine_pic的直方图

②负片图像

③灰度级扩展后的图像

④对数映射变换图像

(2)图像的几何变换(图像的缩放)、旋转、镜像变换(Test3_2)

①原始图像

②图像缩小为原始大小一般的图像

③常规矩形

④斜矩形

3. 实验分析

(1)灰度变换imadjust、intrans函数和stretchlim函数的使用

①读入图像medicine_pic.jpg
f=imread('medicine_pic.jpg');imhist(f,256);          %显示其直方图
②使用imadjust()函数进行灰度转换,实现明暗转换(负片图像)
g1=imadjust(f,[0 1],[1 0]);    %灰度转换,实现明暗转换(负片图像)figure,imshow(g1),title('负片图像');%将0.5到0.75的灰度级扩展到范围[0 1]
③使用imadjust()函数将图像的灰度级扩展到[0 1]
g2=imadjust(f,[0.5 0.75],[0 1]);figure, imshow(g2), title('灰度级扩展后的图像');
④读入图像point.jpg
g=imread('point.jpg');
⑤对输入图像对数映射变换
h=log(1+double(g));
⑥将矩阵h转换为灰度图片   
h=mat2gray(h); 
⑦将灰度图转换为8位图       
h=im2uint8(h);          figure,imshow(h),title('对数映射变换图像');

(2)图像的几何变换(图像的缩放)、旋转、镜像变换

通过对图像进行缩放和旋转操作,可以改变图像的尺寸和角度,从而实现图像的变换和几何形状的调整。

①读入图像Cameraman.tif
②使用imresize()函数将原始图像缩小为原始大小的一半
scale=0.5;J=imresize(I,scale);
创建了一个大小为 640x640 的零矩阵,并在矩阵中创建了一个常规矩形
img_w = 640;img_h = img_w;img_oblique_rect = zeros(img_h, img_w);x1 = int32(img_w / 5 * 2); x2 = int32(img_w / 5 * 3);y1 = int32(img_h / 7); y2 = int32(img_h / 7 * 6);img_oblique_rect(y1:y2, x1:x2) = 1;
使用imrotate()函数对图像进行了旋转,角度为45度,使用双线性插值算法,并通过'crop'参数进行裁剪,以防止旋转后的图像超出原始图像范围。
img_oblique_rect=imrotate(img_oblique_rect,45,'bilinear','crop');
将旋转后的图像进行反转(黑白翻转)
img_oblique_rect = imcomplement(img_oblique_rect);

相关文章:

  • Windows 11 安装 安卓子系统 (WSA)
  • Cesium与Three相机同步(3)
  • 安装局部的typeScript环境
  • 【C++】 解决 C++ 语言报错:Undefined Reference
  • window上部署sql server改动端口、和sqlserver的一些还原、批量插入存储过程的命令
  • Django 模版继承
  • Linux Shell 脚本入门教程:开启你的自动化之旅
  • Python使用(...)连接字符串
  • 微信小程序留言板1
  • 【Spring Boot】统一数据返回
  • vue2+element-ui新增编辑表格+删除行
  • Linux系统常用Conda命令(不断更新!)
  • Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
  • 研0学习Python基础4
  • gda动态调试-cnblog
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 0基础学习移动端适配
  • Android交互
  • Docker 笔记(2):Dockerfile
  • in typeof instanceof ===这些运算符有什么作用
  • js 实现textarea输入字数提示
  • Less 日常用法
  • npx命令介绍
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 产品三维模型在线预览
  • 分类模型——Logistics Regression
  • 工程优化暨babel升级小记
  • 基于axios的vue插件,让http请求更简单
  • 前端之Sass/Scss实战笔记
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 源码安装memcached和php memcache扩展
  • Hibernate主键生成策略及选择
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​【收录 Hello 算法】9.4 小结
  • ​水经微图Web1.5.0版即将上线
  • #Z0458. 树的中心2
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (七)glDrawArry绘制
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Scala的“=”符号简介
  • (转)一些感悟
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET值类型变量“活”在哪?
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [Angular] 笔记 21:@ViewChild
  • [BeginCTF]真龙之力
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)