一:图像算数运算
(1)加法运算
A:概述
加法运算:指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f1(x,y)和 f 2 ( x , y ) f_{2}(x,y) f2(x,y),则它们的加法运算可表示为
g ( x , y ) = f 1 ( x , y ) + f 2 ( x , y ) g(x,y)=f_{1}(x,y) + f_{2}(x,y) g(x,y)=f1(x,y)+f2(x,y)
进行图像加法运算时,处理和值的方式主要有以下几种
- 截断处理:当两幅图像的对应像素值相加结果超出图像灰度级的最大值时,将结果强制截断为最大灰度级,例如在8位灰度图像中,最大值为255
- 加权求和:不同位置的像素值不仅仅是简单地相加,还需要根据不同位置的权重进行加权,以便更好地满足具体的应用需求
- 缩放处理:将两幅图像的对应像素值相加结果缩放到指定的灰度级范围内,例如在8位灰度图像中,将结果除以一个因子,使其不超过255
- 溢出处理:当两幅图像的对应像素值相加结果超出图像灰度级的最大值时,将结果自动溢出到下一级别,例如在8位灰度图像中,溢出到9级时,像素值为0,溢出到10级时,像素值为1,以此类推
- 饱和度处理:当两幅图像的对应像素值相加结果超出图像灰度级的最大值时,将结果设定为最大值。这种处理方式也被称为上溢出处理,而下溢出处理则将结果设定为0
图像加法运算主要应用如下
- 图像增强:通过将一幅图像与一幅较亮或较暗的图像相加,可以增强图像的对比度和亮度,使其更加清晰明亮
- 图像融合:将两幅不同角度或不同波段的图像进行加权和处理,可以得到一幅融合后的图像,用于提高图像的质量和信息量
- 目标检测:将不同尺度或不同方向的图像进行加权和处理,可以得到一幅新的图像,用于检测目标的位置和形状
- 噪声去除:通过将一幅图像与一幅平滑或模糊的图像相加,可以抑制图像中的噪声,提高图像的信噪比
- 彩色图像生成:将不同波段的灰度图像进行加权和处理,可以得到一幅新的彩色图像,用于彩色图像的生成和处理
B:程序
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
imadd(X,Y)
函数:是MATLAB中用于执行图像加法运算的函数
-
A
和B
是两幅需要相加的图像,它们可以是灰度图像、RGB图像或二值图像 - 除此之外,
imadd()
函数还可以通过添加一些可选参数来控制图像加法运算的处理方式。以下是其中一些常用的可选参数-
scaling
:用于控制图像加法运算的缩放方式,可选值有uint8
、uint16
、single
、double
。默认值为uint8
-
outputtype
:用于指定输出图像的数据类型,可选值包括与输入图像类型相同的类型,默认值与输入图像类型相同 -
fillvalues
:用于指定当相加结果超出图像灰度级范围时,如何填充超出范围的像素值-
bound
:截断处理(默认) -
nearest
:最近邻差值 -
samesize
:将超出范围的像素值设为输入图像的最大值
-
-
uint16
:用于将输出图像的数据类型指定为16位无符号整型,可用于处理高动态范围图像
-
实现如下效果
Back = imread('desert.jpg');
Foreground = imread('car.jpg');
result1 = imadd(Foreground,-100);
result2 = imadd(Back, Foreground);
result3 = imadd(Back, result1);
subplot(221),imshow(Foreground),title('原目标图');
subplot(222),imshow(result1),title('原目标图加标量');
subplot(223),imshow(result2),title('原目标图加背景');
subplot(224),imshow(result3),title('加标量图叠加背景');
Python实现:使用Python实现上述同样的功能
cv2.add(src1, src2[, dst[, mask[, dtype]]])
函数:该函数将每个像素的值相加,并将结果存储在输出图像中。如果相加的结果大于输出图像的数据类型所能表示的最大值,则该像素的值将被截断,并存储为最大值。如果输出图像的数据类型为无符号整数类型,则任何小于0的像素值都会被截断为0。如果输出图像的数据类型为有符号整数类型,则任何大于最大值的像素值都会被截断为最大值
-
src1
:第一个输入图像。 -
src2
:第二个输入图像。 -
dst
:输出图像,它的大小和类型与输入图像相同,或者可以为None
。 -
mask
:一个可选的掩膜图像,它必须与输入图像具有相同的尺寸,或者可以为None
。 -
dtype
:输出图像的数据类型,如果没有指定,则默认为src1.dtype
。
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
Back = cv2.imread('desert.jpg')
Foreground = cv2.imread('car.jpg')
result1 = cv2.add(Foreground, -100)
result2 = cv2.add(Back, Foreground)
result3 = cv2.add(Back, result1)
plt.subplot(221), plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB)), plt.title('原目标图')
plt.subplot(222), plt.imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)), plt.title('原目标图加标量')
plt.subplot(223), plt.imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)), plt.title('原目标图加背景')
plt.subplot(224), plt.imshow(cv2.cvtColor(result3, cv2.COLOR_BGR2RGB)), plt.title('加标量图叠加背景')
plt.show()
(2)减法运算
A:概述
减法运算:指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f1(x,y)和 f 2 ( x , y ) f_{2}(x,y) f2(x,y),则它们的减法运算可表示为
g ( x , y ) = f 1 ( x , y ) − f 2 ( x , y ) g(x,y)=f_{1}(x,y) - f_{2}(x,y) g(x,y)=f1(x,y)−f2(x,y)
进行图像加法运算时,处理和值的方式主要有以下几种
- 截断处理:将两幅图像对应像素点的灰度值相减后,如果差值超过了一定的阈值,就将其截断为该阈值,否则保留原值作为差值结果
- 取绝对值:将两幅图像对应像素点的灰度值相减,再取绝对值作为两幅图像差值的结果。该方法简单易实现,但容易受到图像亮度和对比度的影响,对灰度变化较大的图像效果不佳
- 平方差值:将两幅图像对应像素点的灰度值相减后取平方,再将所有差值求和并开方,作为两幅图像差值的结果。该方法能够有效地消除灰度变化对结果的影响,但会放大灰度变化较大的区域,从而影响差值的准确性
- 加权平方差值:为了平衡两种方法的缺点,可以使用加权平方差值法,即将每个像素点的差值乘以一个权重系数后再求和并开方。常用的权重系数包括高斯函数、均匀分布函数等,能够有效地消除灰度变化对结果的影响,同时避免了平方差值法放大灰度变化较大的区域的缺点
图像减法运算主要应用如下
- 目标检测:将背景图像与包含目标的图像相减,得到只有目标区域的差异图像,可以通过差异图像进行目标检测和识别
- 图像增强:将图像的低频分量与高频分量分离,去除低频分量得到的高频图像与原图像相减,可以增强图像的边缘和细节
- 背景消除:在视频处理中,通过将当前帧图像与前一帧图像相减,得到差异图像,可以用于背景消除和移动物体的跟踪
- 纹理分析:在纹理分析中,将一幅图像与其经过旋转或缩放等变换后的图像相减,可以得到只包含纹理信息的图像,用于纹理分类和分析
- 形态学处理:在形态学处理中,将图像进行二值化处理后,将原图像与腐蚀、膨胀等形态学操作的结果图像相减,可以得到形态学处理后的图像
B:程序
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
imsubtract
函数:是MATLAB中用于计算两幅图像之间像素值差异的函数。它可以用来减去一个图像中的像素值,以及两幅图像中对应像素之间的差异
- 输入参数
I1
和I2
表示需要计算差异的两幅图像,它们可以是灰度图像或彩色图像。输出参数J
是计算得到的结果图像,它的大小和类型与输入图像相同 - 可选参数
'uint8'
和'intensity'
用于指定输出结果的数据类型,可以是uint8
或double
类型。如果省略这个参数,imsubtract
函数会默认使用与输入图像相同的数据类型
J = imsubtract(I1, I2);
J = imsubtract(I1, I2, 'uint8');
J = imsubtract(I1, I2, 'intensity');
imabsdiff
函数:是MATLAB中用于计算两幅图像之间像素值绝对差异的函数。它可以用来计算两幅图像中对应像素之间的绝对差异。该函数没有可选参数
实现如下效果
Back=imread('hallback.bmp');
Foreground=imread('hallforeground.bmp');
result = imabsdiff(Foreground,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Foreground),title('前景图');
subplot(133),imshow(result),title('图像相减');
Python实现:使用Python实现上述同样的功能
cv2.absdiff(src1, src2[, dst])
函数:是OpenCV中用于计算两个图像差异的函数
-
src1
:第一个输入图像,可以是单通道或多通道图像,数据类型为numpy
数组 -
src2
:第二个输入图像,与src1
有相同的尺寸和数据类型,可以是单通道或多通道图像,数据类型为numpy
数组 -
dst
:可选参数,输出图像,与输入图像有相同的尺寸和数据类型,数据类型为numpy
数组。如果没有指定,则会创建一个与src1
和src2
有相同尺寸和数据类型的数组作为输出
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 读取背景和前景图像
Back = cv2.imread('hallback.bmp')
Foreground = cv2.imread('hallforeground.bmp')
# 计算前景图像和背景图像的像素绝对差值
result = cv2.absdiff(Foreground, Back)
# 使用matplotlib展示结果图像
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
plt.title('背景')
plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(Foreground, cv2.COLOR_BGR2RGB))
plt.title('前景图')
plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title('图像相减')
plt.show()
(3)乘法运算
A:概述
加法运算:是一种逐像素进行的二元运算。它将两个输入图像中对应像素的像素值相乘,得到一个新的输出图像。设两幅图像对应的像素值分别为 f 1 ( x , y ) f_{1}(x,y) f1(x,y)和 f 2 ( x , y ) f_{2}(x,y) f2(x,y),则它们的乘法运算可表示为
g ( x , y ) = f 1 ( x , y ) × f 2 ( x , y ) g(x,y)=f_{1}(x,y) × f_{2}(x,y) g(x,y)=f1(x,y)×f2(x,y)
图像乘法运算主要应用如下
- 图像增强:图像乘法运算可以用来增强图像的对比度和亮度。例如,将一个图像和一个高亮度的常数图像相乘,可以使图像中较暗的区域变得更加明亮
- 图像合成:图像乘法运算可以用来将两个图像合成成一个图像。例如,将一个图像和一个掩模图像相乘,可以将掩模中非零区域对应的像素从原图像中抠出来,生成一个新的合成图像
- 模糊处理:图像乘法运算可以用来进行模糊处理。例如,将一个图像和一个低通滤波器的频率响应相乘,可以将图像中高频部分去除,从而实现模糊效果
- 频谱分析:图像乘法运算可以用来进行频谱分析。例如,将一个图像和一个频率响应为单位圆的高通滤波器相乘,可以提取出图像中高频部分的信息,从而实现高通滤波效果
- 噪声去除:图像乘法运算可以用来去除图像中的噪声。例如,将一个图像和一个频率响应为单位圆的低通滤波器相乘,可以将图像中高频部分去除,从而去除噪声
B:程序
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
immultiply(A,B,class)
函数:
-
A
和B
分别是输入的两幅图像 -
class
:用于指定输出图像的数据类型-
uint8
:8位无符号整型 -
uint16
:16位无符号整型 -
int16
:16位有符号整型 -
single
:单精度浮点型 -
double
:双精度浮点型
-
实现如下效果
Back=im2double(imread('bird.jpg'));
Templet=im2double(imread('birdtemplet.bmp'));
result = immultiply(Templet,Back);
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Templet),title('模板');
subplot(133),imshow(result),title('图像相乘');
Python实现:使用Python实现上述同样的功能
csv2.multiply
函数:对输入的两个数组进行逐元素相乘,然后将结果写入输出数组中。在相乘过程中,如果元素的结果值超出了输出数组数据类型的表示范围,则结果将被截断。如果指定了缩放参数scale
,则结果将被缩放到可接受的数据类型范围内。如果输出数组的数据类型未指定,则输出数组的数据类型与输入数组相同
-
src1
:第一个数组,必须是单通道或多通道数组,数据类型为浮点型或整型。 -
src2
:第二个数组,与第一个数组的形状和数据类型必须相同。 -
dst
:输出数组,形状和数据类型与输入数组相同。 -
scale
:可选参数,用于对结果进行缩放的标量值。默认值为1,即不进行缩放。 -
dtype
:可选参数,输出数组的数据类型。如果未指定,则输出数组的数据类型与输入数组相同
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 读取背景和模板图片
Back = cv2.imread('bird.jpg').astype(np.float32) / 255.0
Templet = cv2.imread('birdtemplet.bmp').astype(np.float32) / 255.0
# 计算图像相乘
result = cv2.multiply(Templet, Back)
# 展示结果
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
ax[0].imshow(cv2.cvtColor(Back, cv2.COLOR_BGR2RGB))
ax[0].set_title('背景')
ax[1].imshow(cv2.cvtColor(Templet, cv2.COLOR_BGR2RGB))
ax[1].set_title('模板')
ax[2].imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
ax[2].set_title('图像相乘')
plt.show()
(4)除法运算
A:概述
除法运算:是指将一个图像的每个像素值除以另一个图像的相应像素值,从而生成一个新的图像。则它们的除法运算可表示为
g ( x , y ) = f 1 ( x , y ) ÷ f 2 ( x , y ) g(x,y)=f_{1}(x,y) ÷ f_{2}(x,y) g(x,y)=f1(x,y)÷f2(x,y)
图像除法运算在某些应用中确实比加法、减法和乘法运算应用得少一些,但在某些特定情况下,它也是很有用。在某些图像处理应用中,图像除法可以用来纠正图像的光照不均匀性或颜色失真等问题。例如,在医学图像处理中,可以使用背景图像对包含目标的图像进行除法运算,以消除照明变化或其他干扰。此外,图像除法还可以用于图像对比度增强。在对比度增强的应用中,图像除法可以用来增强图像中的高频细节,例如边缘和纹理。通过将图像除以其平滑版本,可以增强高频信息,并使边缘和纹理更加明显
B:程序
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
imdivide(A,B,options)
函数:是MATLAB中的一个图像处理函数
-
A
和B
是两个输入的图像矩阵。需要注意的是,如果B
中某个像素的值为0,则对应的像素在输出图像C
中的值将为Inf
(无穷大)。此外,如果输入矩阵包含浮点数,则输出矩阵也将是浮点数,否则输出矩阵将与输入矩阵具有相同的数据类型 -
options
结构体包含以下字段-
RoundingMethod
:取值可以为'floor'
(向下取整,默认值)、'ceil'
(向上取整)、'fix'
(取整数部分)、'round'
(四舍五入),指定除法运算时的舍入方式。 -
NaNBehavior
:取值可以为'omit'
(省略NaN,默认值)或'replace'
(用0代替NaN),指定如何处理B
中包含NaN的情况
-
Python实现:使用Python实现上述同样的功能。需要注意的是,c2.divide
函数不支持指定舍入方式或者NaN的处理方式。如果需要实现这些功能,需要手动编写代码实现
cv2.divide(src1, src2, dst=None, scale=1)
函数:
-
src1
和src2
是输入的两个图像 -
scale
参数是一个标量,表示除以src2
的缩放因子,默认值为1
二:图像逻辑运算
(1)概述
逻辑运算:在数字图像处理中,逻辑运算指的是使用逻辑运算将两个或更多的图像组合起来的操作。这些操作也被称为位操作,因为它们对图像中每个像素的各个位进行操作。数字图像处理中常用的逻辑运算包括
- 与运算(AND):在这个操作中,两个输入图像中的相应像素被比较。如果两个像素都是非零(数值为1),输出像素被设置为1。否则,输出像素被设置为0(只要出现0结果就是0)
- 或运算(OR):在这个操作中,两个输入图像中的相应像素被比较。如果其中一个像素的值为1,则输出像素被设置为1。否则,输出像素被设置为0(只要出现1结果就是1)
- 异或运算(XOR):在这个操作中,两个输入图像中的相应像素被比较。如果像素有不同的值(一个像素是1,另一个是0),输出像素被设置为1。否则,输出像素被设置为0(0和任何数异或都是任何数,任何数与自己异或都是0)
- 取反运算(NOT):在这个操作中,输入图像中的每个像素都被反转。如果一个像素的值是1,它就被设置为0,反之亦然
(2)程序
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
-
C = bitcmp(A)
:按位求反 -
C = bitand(A,B)
:按位求与 -
C = bitor(A,B)
: 按位求或 -
C = bitxor(A,B)
:按位求异或
实现如下效果
Back=imread('bird.jpg');
Templet=imread('birdtemplet.bmp');
result1=bitcmp(Back);
result2=bitand(Templet,Back);
result3=bitor(Templet,Back);
result4=bitxor(Templet,Back);
figure;
subplot(121),imshow(Back),title('Back');
subplot(122),imshow(Templet),title('Templet');
figure;
subplot(221),imshow(result1),title('图像求反');
subplot(222),imshow(result2),title('图像相与');
subplot(223),imshow(result3),title('图像相或');
subplot(224),imshow(result4),title('图像异或');
Python实现:使用Python实现上述同样的功能文章来源:https://www.toymoban.com/news/detail-411539.html
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
Back = cv2.imread('bird.jpg')
Templet = cv2.imread('birdtemplet.bmp')
result1 = cv2.bitwise_not(Back)
result2 = cv2.bitwise_and(Templet, Back)
result3 = cv2.bitwise_or(Templet, Back)
result4 = cv2.bitwise_xor(Templet, Back)
plt.subplot(221), plt.imshow(result1), plt.title('图像求反')
plt.subplot(222), plt.imshow(result2), plt.title('图像相与')
plt.subplot(223), plt.imshow(result3), plt.title('图像相或')
plt.subplot(224), plt.imshow(result4), plt.title('图像异或')
plt.show()
文章来源地址https://www.toymoban.com/news/detail-411539.html
到了这里,关于(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!