opencv学习笔记(八):图像的算术操作(I)

opencv学习笔记(八):图像的算术操作( I I I)

图像的加法操作

图像在程序中是以矩阵的形式保存的,因此我们也可以用矩阵加法来进行两张图像像素点的相加。除了 OpenCV 中的 cv2.add 函数以外,我们还可以使用 NumPy 模块来进行图像的加法运算。

但两者在某些情况下会产生不同的结果,原因在于 OpenCV 和 NumPy 模块处理溢出的方法不同。溢出是什么呢?举个例子,如果一张单通道图像的像素点数值为 250,另一张图像上同位置的像素点数值为 10,那么二者相加以后就是 260,可是像素值的上限是 255,所以这个时候我们就遇到了溢出问题。

OpenCV 处理溢出的方法是饱和操作,而 NumPy 模块处理溢出的方法是模操作。例如,在 OpenCV 中,如果遇到了 250+10=260 这种情况,它会选取最大值 255;而在 NumPy 模块中,它就等于执行了(250+10)%255=5。基于我们的理解来讲,一般比较希望出现 OpenCV 中的结果,而且 NumPy 模块的结果与原来的两张图像都有比较大的差别,所以在对图像进行算术加法的时候,相较于 NumPy 模块,我们更加倾向于使用 OpenCV。
为了使这两种图像加法的不同点显示的更加明显,这里使用lena的灰度图像两次叠加,分别观察运行结果。
使用的lean灰度原图如下:
在这里插入图片描述

使用NumPy模块进行图像加法

直接使用+即可

import cv2
import numpy as np
img_1= cv2.imread('lena_gray.png',cv2.IMREAD_UNCHANGED)
img_2 = img_1
img = img_1 + img_2 #使用NumPy模块加法
cv2.imshow('numpy',img)
cv2.waitKey(0)

运行结果如下:可见有些像素点再图片叠加后本应该更亮,但此时却变暗了,这就是因为NumPy模块加法的取模导致的,当像素值(该实验中是灰度值)大于255后做模操作(取余)导致的,即在本实验中导致某些像素点不亮反暗。
在这里插入图片描述

使用OpenCV进行图像加法 cv2.add()

函数原型:cv2..add(src1, src2[, dst[, mask[, dtype]]])
参数说明:
src1 first input array or a scalar.(第一张图片)
src2 second input array or a scalar.(第二张图片)
dst output array that has the same size and number of channels as the input array(s); the depth is defined by dtype or src1/src2.
mask optional operation mask - 8-bit single channel array, that specifies elements of the output array to be changed.
dtype optional depth of the output array (see the discussion below).
import cv2
import numpy as np
img_1= cv2.imread('lena_gray.png',cv2.IMREAD_UNCHANGED)
img_2 = img_1
img = cv2.add(img_1, img_2)
cv2.imshow('OpenCV',img)
cv2.waitKey(0)

运行结果如下:可见,处理后的图像更加亮,这是因为OpenCV对图像溢出的解决方式为饱和操作,当某点像素值溢出时,该点像素值会取最大值255。
在这里插入图片描述

图像加权

函数原型:cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
参数说明:
src1 first input array.(第一张图片)
alpha weight of the first array elements.(第一张图片权重)
src2 second input array of the same size and channel number as src1.(第二张图片)
beta weight of the second array elements.(第二张图片权重)
gamma scalar added to each sum.(标量)
dst output array that has the same size and number of channels as the input arrays.
dtype optional depth of the output array; when both input arrays have the same depth, dtype can be set to -1, which will be equivalent to src1.depth().

图像加权cv2.addWeighted的计算规则:假设有两张原图片a,b,一张新图片c,三个参量 α \alpha α(图片a的权重), β \beta β(图片b的权重), γ \gamma γ(常量),那么, c = a ∗ α + b ∗ β + γ c=a*\alpha+b*\beta+\gamma c=aα+bβ+γ

import cv2
import numpy as np
img_1 = cv2.imread('1.jpg',cv2.IMREAD_UNCHANGED)
img_2 = cv2.imread('3.jpg',cv2.IMREAD_UNCHANGED)
img = cv2.addWeighted(img_1,0.3,img_2,0.7,20)
cv2.imshow('AddWeight',img)
cv2.waitKey(0)

运行结果如下:
在这里插入图片描述

倒置加权如下(互换两张图片的加权值):
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zxt510001/article/details/126943220