这篇文章上次修改于 248 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

数值计算

在图像处理过程中,经常需要对图像进行加法运算,这时候使用符号“+”,或者函数cv2.add皆可。
对于使用“+”进行数值计算时,应当遵循如下定律:
image.png

若想要增加图像的整体亮度,可以将每个像素值加上一个特定的值
比如我们引入一张猫的图,对其整体数组进行+50操作:

img_cat=cv2.imread('cat.jpg')
img_cat2= img_cat +50
img_cat[:5,:,0]

我们查看特定部分单一通道的原始数值:

array([[142, 146, 151, ..., 156, 155, 154],
       [107, 112, 117, ..., 155, 154, 153],
       [108, 112, 118, ..., 154, 153, 152],
       [139, 143, 148, ..., 156, 155, 154],
       [153, 158, 163, ..., 160, 159, 158]], dtype=uint8)

再来查看+50操作后的值:

img_cat2[:5,:,0]
array([[192, 196, 201, ..., 206, 205, 204],
       [157, 162, 167, ..., 205, 204, 203],
       [158, 162, 168, ..., 204, 203, 202],
       [189, 193, 198, ..., 206, 205, 204],
       [203, 208, 213, ..., 210, 209, 208]], dtype=uint8)

可以很明显的看到,所有的数组值都被+50操作,反映到图像上就是图片整体变亮了。
不过根据前面所说的定律,当a+b的值>255时,输出的值为mod(a+b)%256,因此,原本过白的地方反而会变黑,从而影响整体效果:
image.png

对于使用cv2.add函数而言,所得到的结果与使用符号“+”有所不同:
image.png

例如,将前面的cat和cat2两个图像通过add函数相互叠加,则输出结果:

cv2.add(img_cat,img_cat2)[:5,:,0]
array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)

可以看到,此时的输出结果取了最大值。

让我们来做一个更鲜明的比较:

import cv2
a=cv2.imread("lena.jpg",0)
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("original",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()

image.png

从左到右依次是原图,使用符号叠加图和函数叠加图,输出的结果与前面所解释的相同。

图像融合

图像融合,顾名思义,可以将两张图像融合成为一张图像,融合的图像兼具二者的特征:
现在尝试融合猫和狗的照片:

img_cat + img_dog

到这里报错了,报错信息是:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-54-e8802e660946> in <module>
----> 1 img_cat + img_dog

ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3) 

大概的意思是进行融合的两张图像,其x轴和y轴的大小,以及通道数必须完全一致,否着会导致融合错误。
因此,需要对其中一张照片进行调整,使其x轴和y轴的大小与另一张图片等同。
这里我对狗的图像进行调整:

img_dog = cv2.resize(img_dog, (500, 414))#y,x
img_dog.shape

此时,该图像的输出结果为:(414, 500, 3)

完成这一步,就可以对图像进行融合操作了:
image.png

res = cv2.addWeighted(img_cat, 0.5, img_dog, 0.5, 0)

image.png

图像翻转

#在 OpenCV 中,图像的翻转采用函数 cv2.flip()实现,该函数能够实现图像在
#水平方向翻转、垂直方向翻转、 两个方向同时翻转,
import cv2
img=cv2.imread("lena.jpg")
x=cv2.flip(img,0)#绕着 x 轴翻转
y=cv2.flip(img,1)#绕着 y轴翻转
xy=cv2.flip(img,-1)#绕着x, y轴翻转
cv2.imshow("img",img)
cv2.imshow("x",x)
cv2.imshow("y",y)
cv2.imshow("xy",xy)
cv2.waitKey()
cv2.destroyAllWindows()

image.png