实验二 图像的代数运算

一、实验目的:

1.了解图像的算术运算在数字图像处理中的初步应用。

2.体会图像算术运算处理的过程和处理前后图像的变化。

二、实验内容:

1.图像的加法运算

图像相加一般用于对同一场景的多幅图像求平均效果,以便有drrrrrr效地降低具有叠加性质的随机噪声。直接采集的图像品质一般都较好,不需要进行加法运算处理,但是对于那些经过长距离模拟通讯方式传送的图像(如卫星图像),这种处理是必不可少的。

在MATLAB中,如果要进行两幅图像的加法,或者给一幅图像加上一个常数,可以调用imadd函数来实现。imadd函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素值之和作为输出图像。imadd函数的调用格式如下:

Z = imadd(X,Y)

其中,X和Y表示需要相加的两幅图像,返回值Z表示得到的加法操作结果。

图像加法在图像处理中应用非常广泛。例如,以下代码使用加法操作将图2.1中的(a)、(b)两幅图像叠加在一起:

I = imread(‘flower.tif’);

J = imread(‘rice.tif’);

K = imadd(I,J);

imshow(K);

叠加结果如图2.2所示。

   

2.1 待叠加的两幅图像          

2.2 叠加后的图像效果

给图像的每一个像素加上一个常数可以使图像的亮度增加。例如,以下代码将增加图2.3(a)所示的RGB图像的亮度,加亮后的结果如图2.3(b)所示。

RGB = imread(‘flower.tif’);

RGB2 = imadd(RGB,50);

subplot(1,2,1);imshow(RGB);

subplot(1,2,2);imshow(RGB2);

RGB=imread('flower.tif');

RGB2=imadd(RGB,-50);

subplot(1,2,1);imshow(RGB);

subplot(1,2,2);imshow(RGB2);%亮度变暗  

       

                                加50                                                                减50

2.3 亮度增加与变暗

两幅图像的像素值相加时产生的结果很可能超过图像数据类型所支持的最大值,尤其对于uint8类型的图像,溢出情况最为常见。当数据值发生溢出时,imadd函数将数据截取为数据类型所支持的最大值,这种截取效果称之为饱和。为了避免出现饱和现象,在进行加法计算前最好将图像转换为一种数据范围较宽的数据类型。例如,在加法操作前将uint8图像转换为uint16类型。

2.图像的减法运算

图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。图像减法可以作为许多图像处理工作的准备步骤。例如,可以使用图像减法来检测一系列相同场景图像的差异。图像减法与阈值化处理的综合使用往往是建立机器视觉系统最有效的方法之一。在利用图像减法处理图像时往往需要考虑背景的更新机制,尽量补偿由于天气、光照等因素对图像显示效果造成的影响。

在MATLAB中,使用imsubtract函数可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数。imsubtract函数将一幅输入图像的像素值从另一幅输入图像相应的像素值中减去,再将这个结果作为输出图像相应的像素值。imsubtract函数的调用格式如下:

Z = imsubtract(X,Y);

其中,Z是X-Y操作的结果。以下代码首先根据原始图像(如图2.4(a)所示)生成其背景亮度图像,然后再从原始图像中将背景亮度图像减去,从而生成图2.4(b)所示的图像:

I = imread(‘cameraman.tif’);

background = imopen(cameraman, strel(‘disk’,15));

I2 = imsubtract(rice, background);

subplot(1,2,1);imshow(I);

subplot(1,2,2);imshow(I2);

     

2.4 原始图像、减去背景图像

如果希望从图像数据I的每一个像素减去一个常数,可以将上述调用格式中的Y替换为一个指定的常数值,例如:

Z = imsubtract(I,50);

减法操作有时会导致某些像素值变为一个负数,对于uint8或uint16类型的数据,如果发生这种情况,那么imsubtract函数自动将这些负数截取为0。为了避免差值产生负值,同时避免像素值运算结果之间产生差异,可以调用函数imabsdiff。imabsdiff将计算两幅图像相应像素差值的绝对值,因而返回结果不会产生负数。该函数的调用格式与imsubtract函数类似。

3. 图像的乘法运算

两幅图像进行乘法运算可以实现掩模操作,即屏蔽掉图像的某些部分。一幅图像乘以一个常数通常被称为缩放,这是一种常见的图像处理操作。如果使用的缩放因子大于1,那么将增强图像的亮度,如果因子小于1则会使图像变暗。缩放通常将产生比简单添加像素偏移量自然得多的明暗效果,这是因为这种操作能够更好地维持图像的相关对比度。此外,由于时域的卷积或相关运算与频域的乘积运算对应,因此乘法运算有时也被作为一种技巧来实现卷积或相关处理。

在MATLAB中,使用immultiply函数实现两幅图像的乘法。immultiply函数将两幅图像相应的像素值进行元素对元素的乘法操作(MATLAB点乘),并将乘法的运算结果作为输出图形相应的像素值。immulitply函数的调用格式如下:

Z = immulitply(X,Y)

其中,Z=X*Y。例如,以下代码将使用给定的缩放因子对图2.5(a)所示的图像进行缩放,从而得到如图2.5(b)所示的较为明亮的图像:

I = imread(‘room.tif’);

J = immultiply(I,1.2);

subplot(1,2,1);imshow(I);

subplot(1,2,2);imshow(J);

 

2.5 原图和乘以因子1.5 的图像

uint8图像的乘法操作一般都会发生溢出现象。Immultiply函数将溢出的数据截取为数据类型的最大值。为了避免产生溢出现象,可以在执行乘法操作之前将uint8图像转换为一种数据范围较大的图像类型,例如uint16。

4.图像的除法运算

除法运算可用于校正成像设备的非线性影响,这在特殊形态的图像(如断层扫描等医学图像)处理中常常用到。图像除法也可以用来检测两幅图像间的区别,但是除法操作给出的是相应像素值的变化比率,而不是每个像素的绝对差异,因而图像除法也称为比率变换。

在MATLAB中使用imdivide函数进行两幅图像的除法。imdivide函数对两幅输入图像的所有相应像素执行元素对元素的除法操作(点除),并将得到的结果作为输出图像的相应像素值。imdivide函数的调用格式如下:

Z = imdivide(X,Y)

其中,Z=X/Y。例如,以下代码将图4所示的两幅图像进行除法运算,请将这个结果和减法操作的结果相比较,对比它们之间的不同之处:

I1= imread(‘cameraman.tif’);

I = double(I1);

J= I * 0.43 + 90;

I2 = uint8(J);

Ip = imdivide(I, I2);

Imshow(Ip, []);

除法操作的结果如图2.6所示。

2.6 原图和减背景后的图像相除的图像效果

5.图像的四则代数运算

可以综合使用多种图像代数运算函数来完成一系列的操作。例如,使用以下语句计算两幅图像的平均值:

I = imread(‘rice.tif’);

I2 = imread(‘.tif’);

K = imdivide(imadd(I,I2),2);

建议最好不要用这种方式进行图像操作,这是因为,对于uint8或uint16数据,每一个算术函数在将其输出结果传递给下一项操作之前都要进行数据截取,这个截取过程将会大大减少输出图像的信息量。执行图像四则运算操作较好的一个办法就是使用函数imlincomb。函数imlincomb按照双精度执行所有代数运算操作,而且仅对最好的输出结果进行截取,该函数的调用格式如下:

Z = imlincomb(A,X,B,Y,C);

其中,Z=A*X+B*Y+C。MATLAB会自动根据输入参数的个数判断需要进行的运算。例如,以下语句将计算Z=A*X+C:

Z = imlincomb(A,X,C)

而以下语句将计算Z=A*X+B*Y:

Z = imlincomb(A,X,B,Y,)

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

1.实验程序

(1)图像的加法运算 (脚本test2_1)

I = imread('flower.tif');

whos I

I = I(:,:,1:3); 

whos I

J = imread('rice.tif');

whos J

K = imadd(I,J);

imshow(K);

title('叠加后的图像');

figure;

RGB = imread('flower2.tif');

RGB2 = imadd(RGB,50);

subplot(1,2,1);imshow(RGB);

title('原始图像');

subplot(1,2,2);imshow(RGB2);

title('增加50亮度后的图像');

figure;

RGB=imread('flower2.tif');

RGB2=imadd(RGB,-50);

subplot(1,2,1);imshow(RGB);

title('原始图像');

subplot(1,2,2);imshow(RGB2);%亮度变暗 

title('减少50亮度后的图像');

(2)图像的减法运算 (脚本test2_2)

I = imread('cameraman.tif');

background = imopen(I, strel('disk',15));

I2 = imsubtract(I, background);

subplot(1,2,1);imshow(I);

title("原始图像")

subplot(1,2,2);imshow(I2);

title("减去背景图像")

(3)图像的乘法运算 (脚本test2_3)

I = imread('room.tif');

J = immultiply(I,1.2);

subplot(1,2,1);imshow(I);

title('原始图像');

subplot(1,2,2);imshow(J);

title('乘以因子1.5 的图像');

(4)图像的除法运算 (脚本test2_4)

I1 = imread('cameraman.tif');

I = double(I1);

J = I * 0.43 + 90;

I2 = J; % 将 I2 保持为双精度类型

Ip = imdivide(I, I2);

subplot(1, 3, 1);

imshow(I1);

title('原始图像');

subplot(1, 3, 2);

imshow(Ip, []);

title('减背景后的图像相除的图像');

subplot(1, 3, 3);

imshow(I2, []);

title('减背景后的图像');

(5)图像的四则代数运算 (脚本test2_5)

I = imread('rice.tif');

whos I

J = imread('room.tif');

whos J

I1 = double(I);

J1= double(J);

K = imlincomb(1.1, I1, 0.9, J1, 50, 'uint16');

whos K

K = uint8(K);

subplot(1, 3, 1);

imshow(I, []);

title('图像 I');

subplot(1, 3, 2);

imshow(J, []);

title('图像 J');

subplot(1, 3, 3);

imshow(K, []);

title('I和J线性组合后的图像');

2.实验结果

(1)图像的加法运算

①两张图像叠加

②增加常数变亮

 

③变暗后的图像

 

(2)图像的减法运算

(3)图像的乘法运算

(4)图像的除法运算

(5)图像的四则代数运算

3.实验分析

(1)图像的加法运算

①首先加载名为flower.tifrice.tif的图像,分别存储在变量I和J中。
I = imread('flower.tif');

J = imread('rice.tif');
②然后将I 转换为只有三个通道的彩色图像,使两幅图像大小和类型保持一致,否则无法叠加。
I = I(:,:,1:3); 
③最后使用 imadd 函数将图像 I 和图像 J 进行叠加,结果存储在变量 K 中。
K = imadd(I,J);

①首先使用imread函数加载名为 flower2.tif的彩色图像,存储在变量 RGB 中。

RGB = imread('flower2.tif');
②然后使用imadd函数增加50 RGB 图像的亮度
RGB2 = imadd(RGB,50);

①首先使用imread函数加载名为 flower2.tif的彩色图像,存储在变量 RGB 中。

RGB=imread('flower2.tif');
②然后使用imadd函数减少50 RGB 图像的亮度
RGB2=imadd(RGB,-50);

(2)图像的减法运算

①首先加载名为cameraman.tif的图像
I = imread('cameraman.tif');
②通过 imopen(I, strel('disk',15)) 函数创建了一个结构元素,然后使用 imopen 函数对原始图像 I 进行了开运算操作,以获得背景信息。
background = imopen(I, strel('disk',15));
③使用 imsubtract 函数对原始图像 I 和背景图像进行减法运算,得到了减去背景后的图像 I2
I2 = imsubtract(I, background);

(3)图像的乘法运算

①首先使用imread函数加载图像
I = imread('room.tif');
②使用 immultiply(I,1.5) 对原始图像 I 中的每个像素值乘以因子 1.5
I = imread('room.tif');

注:因子大于 1 时,图像的亮度会增加;因子小于 1 时,图像的亮度会减小。

(4)图像的除法运算

①首先使用imread函数加载图像
I1 = imread('cameraman.tif');
②将原始图像 I1 转换为 double 类型,并进行了一系列线性变换,其中包括乘以一个因子并加上一个偏置值,得到图像 J。
I = double(I1);

J = I * 0.43 + 90;

I2 = J; % 将 I2 保持为双精度类型
③使用 imdivide 函数对原始图像 I 和减去背景后的图像 I2 进行相除操作,得到了相除后的图像 Ip。
Ip = imdivide(I, I2);

(5)图像的四则代数运算

①首先使用imread函数加载图像rice.tif和room.tif
I = imread('rice.tif');

J = imread('room.tif');
②将它们转换为 double 类型以进行线性组合
I1 = double(I);

J1= double(J);
③使用imlincomb函数对图像I和J进行线性组合,权重分别为1.1和0.9,加上偏置值50,结果存储在变量K中。这个操作可以将两幅图像按照给定的权重进行加权组合,从而生成一幅新的图像。使用了uint16类型作为输出图像的数据类型。
K = imlincomb(1.1, I1, 0.9, J1, 50, 'uint16');

四、思考题

1.由图像算术运算的运算结果,思考图像减法运算在什么场合上发挥优势?

答:(1)背景去除:在一些情况下,图像中的背景可能对目标的检测和分析产生干扰。通过对包含目标和背景的两幅图像进行减法运算,可以将背景从图像中去除,突出目标的特征和边缘。

(2)运动检测:在视频监控和运动分析中,图像减法可以用于检测图像序列中的运动物体。通过对连续帧之间进行减法运算,可以获得移动物体的差异图像,从而实现运动检测和跟踪。

(3)亮度调整:图像减法运算可以用于对图像的亮度进行调整。通过将图像中的每个像素值减去一个常数值,可以增加或减少图像的亮度水平,使图像更加清晰或更加柔和。

(4)图像增强:在一些情况下,图像中的某些部分可能受到噪声、光照变化或其他因素的影响,从而降低了图像的质量。通过对原始图像和经过滤波处理后的图像进行减法运算,可以增强图像中的目标特征,提高图像的质量和清晰度。

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

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

相关文章

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…

如何在TikTok上获得更多观看量:12个流量秘诀

TikTok作为热门海外社媒,在跨境出海行业中成为新兴的推广渠道,但你知道如何让你的TikTok赢得更多关注次数吗?如果您正在寻找增加 TikTok 观看次数的方法,接下来这12种策略,你需要一一做好! 1. 在内容中添加…

女性经济崛起,天润融通用客户感知挖掘市场潜力

每逢一年一度的国际妇女节,“女性”话题都会被郑重地讨论。 从消费市场上来说,最近几年女性群体正在拥有越来越大的影响力,甚至出现了“她经济”这样的专属词汇在最近几年被市场反复讨论。 毫无疑问,女性消费群体的崛起已经成为…

2.8亿东亚五国建筑数据分享

数据是GIS的血液! 我们现在为你分享东亚5国的2.8亿条建筑轮廓数据,该数据包括中国、日本、朝鲜、韩国和蒙古5个东亚国家完整、高质量的建筑物轮廓数据,你可以在文末查看领取方法。 数据介绍 虽然开源的全球的建筑数据已经有微软的建筑数据…

【android】【adb shell】写一个shell脚本,监听进程pid变化

前言 当前业务,需要写一个脚本,不断监视com.android.phone 进程是否异常死掉 脚本 #!/system/bin/sh last_pid"" current_pid"" while(true){current_pidps -A | grep com.android.phone | awk {print $2}if [ -n "$current…

大牛“私藏”宝刊,易Accept!中科院1区-Top,偏爱国人,2个月可录!

本周投稿推荐 SCI • 能源科学类,1.5-2.0(来稿即录25天) • 计算机类,2.0-3.0(纯正刊29天录用) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好&a…

职场办公受欢迎的电脑桌面便签,手机电脑同步的备忘录

在快节奏的职场生活中,有效的时间管理和信息记录变得尤为重要。为了帮助大家更好地应对工作挑战,好用的电脑桌面便签和手机电脑同步的备忘录,好用便签应运而生,成为了当前职场办公中的得力助手。 好用便签是一款备受青睐的电脑桌…

SecureCRT--使用sftp上传和下载文件

原文网址:SecureCRT--使用sftp上传和下载文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SecureCRT如何在软件内直接上传和下载文件。 SecureCRT可以用如下两种方法上传和下载文件: 自带的sftp插件服务器安装rz/sz命令 本文介绍第一种方法&#xff0…

【Sping Boot2】笔记

Spring Boot 2入门 如何创建一个Spring Boot的Web例子?1.如何创建一个Spring Boot项目1.1 使用Maven构建一个Spring Boot 2项目1.1.1创建Maven工程注:Maven项目结构: 1.1.2引入SpingBoot相关依赖依赖注意事项: 1.1.3创建主类1.1.4…

CSS动画keyframes简单样例

一、代码部分 1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet" href…

go——Swagger使用

一. 为什么后端需要配置Swagger 在前后端分离的项目中&#xff0c;后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。 Swagger是一个用于设计&#xff0c;构建和文档化API的开源框架。在Go语言中&#xff0c;Swagger可以帮助后端开发人员快速创建和定义RESTf…

JVM 堆内存结构 年轻代 老年代

堆内存 内存划分 对于大多数应用&#xff0c;Java 堆是 Java 虚拟机管理的内存中最大的一块&#xff0c;被所有线程共享。此内存区域的唯一目的就是存放对象实例&#xff0c;几乎所有的对象实例以及数据都在这里分配内存。 为了进行高效的垃圾回收&#xff0c;虚拟机把堆内存…

关键路径——C语言(理论)

关键路径&#xff0c;是项目网络中从起始事件到终止事件的最长路径&#xff0c;决定了项目的最短完成时间。 关键路径中的任务没有任何可调整的余地&#xff0c;如果任何一个任务被延迟&#xff0c;整个项目的完成时间也会被延迟。 假设我们现在有一个图&#xff1a;把图的边…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位&#xff0c;对于信息学奥赛已经不陌生了&#xff0c;部分同学也已经开始踏入信息学的旅程&#xff0c;但前路茫茫&#xff0c;让我们一起看看已经取得成就的同学的经历吧。 今天要介绍的这位同学&#xff0c;是来自深圳中学的高二某班的欧阳达晟同学&#x…

failed to lazily initialize a collection of role,解决Hibernate查询报错

Hibernate报错&#xff1a; org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jiuqi.gov.common.attatchment.entity.AttachmentEntity.properties, could not initialize proxy - no Session at org.hibernate.co…

docker私有仓库harbor部署

docker私有仓库harbor部署 概述 Docker 官方镜像源被中国大陆政府封锁&#xff0c;导致无法在中国大陆的计算机上直接使用 Docker 拉取镜像&#xff0c;导致使用者一下子手足无措了&#xff0c;的确一开始会有很大的影响&#xff0c;为了应对这种影响我们可以自己构建私有仓库&…

昇思25天学习打卡营第4天|yulang

今天主要了解了数据集 Dataset&#xff0c;主要包含了&#xff1a;数据集加载、数据集迭代、数据集常用操作、 可随机访问数据集、可迭代数据集、生成器。对于生成器很好理解&#xff0c;用代码来造数据&#xff0c;可以动态地生成数据。主要作用数据集通常被用于训练模型

12个视觉艺术分类

视觉设计可以按照多种方式进行分类&#xff0c;这些分类通常基于设计的目的、风格或应用场景。本文为大家介绍12种视觉设计&#xff0c;分别是平面设计、标志设计、包装设计、用户界面设计 (UI Design)、用户体验设计 (UX Design)、插图设计、网页设计、动画设计、展览设计、环…

云服务出现故障这样处理

无法连接云服务器 服务器远程无法连接时&#xff0c;可通过7ECloud控制台进行连接。 常见故障现象 1、ping不通 2、ping丢包 3、部分端口telnet不通 4、全部端口telnet不通 5、广告、弹窗植入 6、域名无法访问IP访问正常 常见故障原因 1、云服务器过期、关机或者EIP被…

阿里云物联网应用层开发:第三部分,微信小程序和web客户端实现

文章目录 哔哩哔哩视频教程1、阿里云物联网平台对接微信小程序2、阿里云物联网平台对接web客户端2-1MQTT服务器编写2-2 web端Servlet部分编写备注哔哩哔哩视频教程 【阿里云物联网综合开发,STM32+ESP8266+微信小程序+web客户端一篇教程详细讲解】 https://www.bilibili.com/v…