加法运算:指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 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)
进行图像加法运算时,处理和值的方式主要有以下几种
图像加法运算主要应用如下
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()
减法运算:指将两幅同大小的图像进行像素级别的加法操作,得到一幅新的图像。设两幅图像对应的像素值分别为 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)
进行图像加法运算时,处理和值的方式主要有以下几种
图像减法运算主要应用如下
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()
加法运算:是一种逐像素进行的二元运算。它将两个输入图像中对应像素的像素值相乘,得到一个新的输出图像。设两幅图像对应的像素值分别为 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)
图像乘法运算主要应用如下
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()
除法运算:是指将一个图像的每个像素值除以另一个图像的相应像素值,从而生成一个新的图像。则它们的除法运算可表示为
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)
图像除法运算在某些应用中确实比加法、减法和乘法运算应用得少一些,但在某些特定情况下,它也是很有用。在某些图像处理应用中,图像除法可以用来纠正图像的光照不均匀性或颜色失真等问题。例如,在医学图像处理中,可以使用背景图像对包含目标的图像进行除法运算,以消除照明变化或其他干扰。此外,图像除法还可以用于图像对比度增强。在对比度增强的应用中,图像除法可以用来增强图像中的高频细节,例如边缘和纹理。通过将图像除以其平滑版本,可以增强高频信息,并使边缘和纹理更加明显
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逻辑运算:在数字图像处理中,逻辑运算指的是使用逻辑运算将两个或更多的图像组合起来的操作。这些操作也被称为位操作,因为它们对图像中每个像素的各个位进行操作。数字图像处理中常用的逻辑运算包括
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实现上述同样的功能
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()