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

一、实验目的:

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

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

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

相关文章

工作助手VB开发笔记(2)

今天继续讲功能 2.功能 2.9开机自启 设置程序随windows系统启动,其实就是就是将程序加载到注册表 Public Sub StartRunRegHKLM()REM HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ RunDim strName As String Applicat…

Netty学习(NIO基础)

NIO基础 三大组件 Channel and Buffer 常用的只有ByteBuffer Selector(选择器) 结合服务器的设计演化来理解Selector 多线程版设计 最早在nio设计出现前服务端程序的设计是多线程版设计,即一个客户端对应一个socket连接,一个连接用一个线程处理,每…

基于docker环境及Harbor部署{很简短一点了,耐心看吧}

用到的环境: docker 、nacos、compose、harbor(自行安装 ,以下连接作为参考) nacos:史上最全整合nacos单机模式整合哈哈哈哈哈_nacos 源码启动 单机模式-CSDN博客 docker、compose、harbor:史上最全的整合Harbor安装教程&#…

一览 Anoma 上的有趣应用概念

撰文:Tia,Techub News 本文来源香港Web3媒体:Techub News Anoma 的目标是为应用提供通用的意图机器接口,这意味着使用 Anoma,开发人员可以根据意图和分布式意图机编写应用,而不是根据事务和特定状态机进行…

技术成神之路:设计模式(二)建造者模式

1.定义 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…

UE5 02-给物体一个扭矩力

需要注意的是: 1.弹簧臂 可以使用绝对旋转 这样就可以不跟随父物体Player的旋转 2.弹簧臂 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机会切换到碰撞点位置 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机不会切换到碰撞点位置

RAG 为什么需要文本分割(Chunking)

Picone上的一个博客,翻译过来学习一下,其中加入了一些个人的理解和调整,有兴趣更深入研究的可以看一下文章的原文。 为什么需要文本分割(Chunking) 在构建与LLM相关的应用程序时,Chunking是将大量文本分解…

Python酷库之旅-第三方库Pandas(004)

目录 一、用法精讲 5、pandas.DataFrame.to_csv函数 5-1、语法 5-2、参数 5-3、功能 5-4、返回值 5-5、说明 5-6、用法 5-6-1、代码示例 5-6-2、结果输出 6、pandas.read_fwf函数 6-1、语法 6-2、参数 6-3、功能 6-4、返回值 6-5、说明 6-6、用法 6-6-1、代码…

微信小程序渲染层与逻辑层交互原理

1. 网页开发与小程序开发有何不同? 2. 小程序运行环境 3. 页面渲染技术选型 1. 纯客户端技术; 2. 纯Web技术; 3. 用客户端原生技术与Web技术结合的混合技术(Hybrid),小程序就是使用的这种技术&#xff1…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权,当最后⼀个指涉到该对象的shared_ptr不再指向他时,shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个?《引⽤计数》 shared_ptr构造函数,使引⽤计数析构函数&…

【YOLOv5/v7改进系列】改进池化层为ASPP

一、导言 Atrous Spatial Pyramid Pooling (ASPP)模块是一种用于多尺度特征提取的创新技术,旨在提升深度学习模型在语义图像分割任务中的表现。ASPP模块通过在不同的采样率下应用空洞卷积,可以捕获不同大小的对象以及图像的上下文信息,从而增…

Astro新前端框架首次体验

Astro新前端框架首次体验 1、什么是Astro Astro是一个静态网站生成器的前端框架,它提供了一种新的开发方式和更好的性能体验,帮助开发者更快速地构建现代化的网站和应用程序。 简单来说就是:Astro这个是一个网站生成器,可以直接…

Hyper-V克隆虚拟机教程分享!

方法1. 使用导出导入功能克隆Hyper-V虚拟机 导出和导入是Hyper-V服务器备份和克隆的一种比较有效的方法。使用此功能,您可以创建Hyper-V虚拟机模板,其中包括软件、VM CPU、RAM和其他设备的配置,这有助于在Hyper-V中快速部署多个虚拟机。 在…

前端引用vue/element/echarts资源等引用方法Blob下载HTML

前端引用下载vue/element/echarts资源等引用方法 功能需求 需求是在HTML页面中集成Vue.js、Element Plus(Element UI的Vue 3版本)、ECharts等前端资源,使用Blob下载HTML。 解决方案概述 直接访问线上CDN地址:简单直接&#xff0c…

计算机网络(2

计算机网络续 一. 网络编程 网络编程, 指网络上的主机, 通过不同的进程, 以编程的方式实现网络通信(或网络数据传输). 即便是同一个主机, 只要不同进程, 基于网络来传输数据, 也属于网络编程. 二. 网络编程套接字(socket) socket: 操作系统提供的网络编程的 API 称作 “soc…

【数据结构与算法】堆排序算法原理与实现:基于堆实现的高效排序算法

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​ 目录 一、引言 堆排序的简介 堆排序的特点 二、堆的概念 三、堆排序算法的原理 四、堆…

软件测试面试1000问(含答案)

1、自动化代码中,用到了哪些设计模式? 单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化…

数据结构预科

在堆区申请两个长度为32的空间,实现两个字符串的比较【非库函数实现】 要求: 1> 定义函数,在对区申请空间,两个申请,主函数需要调用2次 2> 定义函数,实现字符串的输入,void input(char …

Jenkins容器的部署

本文主要是记录如何在Centos7上安装docker,以及在docker里面配置tomcat、mysql、jenkins等环境。 一、安装docker 1.1 准备工作 centos7、VMware17Pro 1.2 通过yum在线安装dokcer yum -y install docker1.3 启动docker服务 systemctl start docker.service1.4 查看docke…