实验二 图像的代数运算

news2024/12/23 22:36:19

一、实验目的:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言回顾-内存操作函数

目录 前言 1.memcpy 函数 1.1函数介绍 1.2与strcpy的区别 1.3memcpy的模拟 2.memmove 函数 2.1函数介绍和使用 2.2函数的模拟 3.memset函数 3.1函数介绍 3.2函数的模拟 4.memcmp函数 4.1函数的使用 4.2函数的模拟 结束语 前言 在动态内存的章节中小编详细讲解了动…

pandas数据分析(7)

组合DataFrame 连接 如果只是要将多个DataFrame粘合在一起,那么concat函数是最佳选择。在默认情况下,concat会将DataFrame按行粘合在一起,同时会将各列自动对齐。 如果想要按列进行粘合,需要将axis设置为1: concat的特…

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比,同时还可以兼容ubuntu、安卓等多种操作系统,今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

【Git 学习笔记】gitk 命令与 git log 其他参数的使用

1.7 用 gitk 查看提交历史 # make sure you have gitk installed $ which gitk /usr/bin/gitk # Sync the commit ID $ git checkout master && git reset --hard 13dcad # bring up the gitk interface, --all to see everything $ gitk --all &实测结果&#xf…

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数(m_track)、绘…

网络数据传输中的封装与解封装详解

注:机翻,未校对。 The goal of networks is to transmit data from one host to another. 网络的目标是将数据从一个主机传输到另一个主机。 Encapsulation 封装 To achieve this goal, each layer adds its own header to the data. A header contain…

2024年7月5日 十二生肖 今日运势

小运播报:2024年7月5日,星期五,农历五月三十 (甲辰年庚午月庚午日),法定工作日。 红榜生肖:狗、羊、虎 需要注意:鸡、牛、鼠 喜神方位:西北方 财神方位:正…

深圳合规新动向,这个关键环节要做好

随着全球商业环境的日益复杂化,企业合规管理已成为维护公司稳健运营和市场竞争力的核心要素。特别是对于位于创新前沿的深圳市,有效的合规管理系统不仅是满足法律和监管要求的必须,更是企业可持续发展的关键。 深圳市在全国率先探索并成功实…

#数据结构 笔记三

二叉树 1. 概念 二叉树Binary Tree是n个结点的有限集合。它或者是空集n0,或者是由一个根结点以及两颗互不相交、分别称为左子树和右子树的二叉树组成。 二叉树与普通有序树不同,二叉树严格区分左子和右子,即使只有一个子结点也要区分左右。…

cloudreve 设置开机服务

创建一个Systemd服务文件: 打开终端并创建一个新的服务文件: sudo nano /etc/systemd/system/cloudreve.service 在服务文件中添加以下内容: 根据你的设置调整路径和参数,然后将以下配置粘贴到文件中: [Unit] Descri…

二分查找及其变种

一、概念 二分查找算法(Binary Search Algorithm)是一种在有序数组中查找特定元素的高效搜索方法。 其基本思想是将目标值与数组中间的元素进行比较,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素&…

指标和量化交易那些事儿

最近很多朋友都在给我说,我要盘中打板的指标,我要盘中自动交易。今天我们来梳理下关于指标和量化交易这些事儿! 第一:什么是指标?股票指标是属于统计学的范畴,依据一定的数理统计方法,运用一些…

2024 年 亚太赛 APMCM (C题)中文赛道国际大学生数学建模挑战赛 | 量子计算的物流配送 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! 完整内容可以在文章末尾领取! 该段文字…

PyTorch - 神经网络基础

神经网络的主要原理包括一组基本元素,即人工神经元或感知器。它包括几个基本输入,例如 x1、x2… xn ,如果总和大于激活电位,则会产生二进制输出。 样本神经元的示意图如下所述。 产生的输出可以被认为是具有激活电位或偏差的加权…

班迪录屏(Bandicam)7.0下载以及安装教程

最近有小伙伴私信我,问我有没有好用的录屏工具,今天给大家分享一个我一直在使用的录屏工具,也是解锁了V1P版本,绿色版打开就可以使用~ Bandicam录屏(PC) Bandicam录屏是一款专为捕捉屏幕精彩瞬间而设计的…

go——Swagger使用

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

电传动无杆飞机牵引车交付用户

自2019年起,我们计划做电传动控制,先后做了电传动水泥搅拌罐车罐体控制(国内首创),初步理解了电机控制的特点。 20-21年接着做了10t飞机牵引车控制,还是电液控制联合的,把越野叉车的行驶控制方…

Python学习之小游戏--坦克大作战

今天跟视频学习了Python实现坦克大作战小游戏,挺有意思的,一起来玩吧~ 按空格发射子弹,上下左右键实现移动,ESC键无限复活。 import pygame,time,random from pygame.sprite import Sprite SCREEN_WIDTH800 SCREEN_HEIGHT500 BG…

玩机进阶教程----MTK芯片杂牌机 小品牌机型解除bl锁以及root的操作步骤解析

在玩机过程中会遇到很多小品牌机型或者杂牌机类的。大多都使用mtk芯片。而且基本很少有官方线刷包。在这些机型中玩机首先我们要想办法导出系统来制作线刷包。以免后续解锁bl或者root出现未知故障可以恢复原系统。 那么对于这些机型该如何进行备份固件和root呢。通过博文可以初…

图书借阅小程序论文(设计)开题报告

一、课题的背景和意义 近些年来,随着移动互联网巅峰时期的来临,互联网产业逐渐趋于“小、轻、微”的方向发展,符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中,被誉为“运行着程序的网站”之名的微信小程序…