数字图像处理实验记录一(图像基本灰度变换)

2023-10-11 11:52

本文主要是介绍数字图像处理实验记录一(图像基本灰度变换),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 基础知识
    • 图像是什么样的?
    • 1,空间分辨率,灰度分辨率
    • 2,灰度图和彩色图的区别
    • 3,什么是灰度直方图?
  • 实验要求
    • 1,按照灰度变换曲线对图像进行灰度变换
    • 2,读入一幅图像,分别对其进行求反变换、对数变换和幂次变换。并显示原图像和变换后图像。
  • 实验记录
    • 任务一:
    • 任务二:
      • 反转变换:
      • 对数变换:
      • 幂次变换:
  • 结果展示
    • 结果1:
    • 结果2:
      • 反转变换:
      • 对数变换:
      • 幂次变换:
  • 反思,总结与收获
    • 1,在matlab中让几幅图片在一个窗口显示
    • 2,title(' ') 标题
    • 3,uint8
    • 4,im2double()函数
    • 5,matlab判断语句怎么写
    • 6,matlab 循环语句怎么写
    • 7,清空命令行

基础知识

第一次接触这方面的知识,一开始有点措手不及,过了很久才慢慢了解

图像是什么样的?

在matlab中使用imread()函数读取一副彩色图像后我们得到了以下的矩阵
在这里插入图片描述
在计算机中,图像就是以这种形式保存的。

1,空间分辨率,灰度分辨率

空间分辨率:图像中可分辨的最小细节,由采样间隔值决定,看起来对清晰度有影响
在这里插入图片描述

灰度分辨率:灰度级别中可辨别的最小变化,感觉是黑白色之间过渡的级别
灰度分辨率越小,越黑白

在这里插入图片描述

2,灰度图和彩色图的区别

彩色图:每个像素由R,G,B三个分量表示,用三个二维矩阵分别表示各个像素的R,G,B三个颜色分量。
灰度图:每个像素只有一个采样颜色,所以用一个二维矩阵来表示各个像素的采样颜色。

3,什么是灰度直方图?

在这里插入图片描述
由此可见,进行灰度变换就是改变灰度值

实验要求

1,按照灰度变换曲线对图像进行灰度变换

在这里插入图片描述

2,读入一幅图像,分别对其进行求反变换、对数变换和幂次变换。并显示原图像和变换后图像。

实验记录

任务一:

在这里插入图片描述

了解了以上的知识后,这个图也能够看懂了
原图的灰度曲线应该是这个样子的:
在这里插入图片描述
是一条过原点斜率为1的曲线

通过以下操作可以将其变成要求的曲线

%分段
x0=0;y0=0;
x1=48;y1=23;
x2=196;y2=216;
x3=255;y3=255;%算变换斜率
a1=(y1-y0)/(x1-x0);
a2=(y2-y1)/(x2-x1);
a3=(y3-y2)/(x3-x2);
I2 = I1;
[height,width] = size(I1) %得出图片的高,宽
for row = 1:1:height      %遍历图片矩阵for col = 1:1:widthtmp = I2(row,col);if(tmp < x1)I2(row,col) = a1*tmp;elseif(tmp>=x1&tmp<x2)I2(row,col) = a2*(tmp-x1)+y1;elseI2(row,col) = a3*(tmp-x2)+y2;endend
end
plot(x,y);
hold on
plot([0 x1],[y1 y1],'r--') %画线
plot([x1 x1],[0 y1],'r--') %画线plot([0 x2],[y2 y2],'r--') %画线
plot([x2 x2],[0 y2],'r--') %画线hold off

在这里插入图片描述

接下来我们就可以通过以上步骤对图像进行操作:

%分段
x0=0;y0=0;
x1=48;y1=23;
x2=196;y2=216;
x3=255;y3=255;%算变换斜率
a1=(y1-y0)/(x1-x0);
a2=(y2-y1)/(x2-x1);
a3=(y3-y2)/(x3-x2);
I2 = I1;
[height,width] = size(I1) %得出图片的高,宽
for row = 1:1:height      %遍历图片矩阵for col = 1:1:widthtmp = I2(row,col);if(tmp < x1)I2(row,col) = a1*tmp;elseif(tmp>=x1&tmp<=x2)I2(row,col) = a2*(tmp-x1)+y1;elseI2(row,col) = a3*(tmp-x2)+y2;endend
end

展示结果代码:
在这里插入图片描述

subplot(221);imshow(I1);title('灰度图');
subplot(222);imhist(I1);title('灰度直方图');subplot(223);imshow(I2);title('灰度变换后图');
subplot(224);imhist(I2);title('灰度直方图');

任务二:

反转变换:

把黑变成白,把白变成黑
公式:
在这里插入图片描述
L是灰度级,一般是256

H=imread('山.png');
Hi = 255-H;
subplot(324);imshow(Hi);title('求反变换');

对数变换:

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

I=imread('山.png');
c = 1 %对数因子
I1 = im2double(I);
I3 = uint8(c*log(1+I1*255)/log(256)*255);
subplot(121);imshow(I);title('原图');
subplot(122);imshow(I3);title('对数变换图');

幂次变换:

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

gamma = 2.5; % 幂次参数,可根据需要调整
Hgam = c*im2double(H).^gamma;
subplot(326);imshow(Hgam);title('幂次变换');

结果展示

结果1:

在这里插入图片描述

结果2:

反转变换:

在这里插入图片描述

对数变换:

在这里插入图片描述

幂次变换:

在这里插入图片描述

反思,总结与收获

1,在matlab中让几幅图片在一个窗口显示

subplot(121);imshow(I);title('原图');
subplot(122);imshow(Hgam);title('幂次变换图');

subplot(a,b,c);将窗口分割成a行b列后,这个图片在序号为c的位置
序号排序如下:
在这里插入图片描述
注意:subplot()函数里面的参数要加,分隔,我没有分隔,是坏习惯

2,title(’ ') 标题

在’'之间添加文本就可以显示标题了

3,uint8

图像矩阵的数据类型一般是uint8,无符号8位整型数据

4,im2double()函数

将图的uint8矩阵转成double矩阵,要注意的是,这个函数一般会将原来uint8数据从0~255范围映射到0~1范围,所以当你想把它重新转成uint8的时候要乘255

5,matlab判断语句怎么写

if(条件)...
elseif(条件)
...
else
...
end

6,matlab 循环语句怎么写

for i = 1:7		%这个代表了从17,每次递增1
...
endfor i = 0:2:8   %这个代表了从08,每次递增2
...
end

7,清空命令行

% 在脚本里加入以下语句,在每次运行时会清空命令行
clear all;
clc;

这篇关于数字图像处理实验记录一(图像基本灰度变换)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/187863

相关文章

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将