OpenCV python 图像冲刷

OpenCV python image washout

我正在尝试使用以下代码显示平均合并图像:

import numpy as np
import cv2
import matplotlib.pyplot as plt

dolphin=cv2.imread('dolphin.png',0) #Also tried without the 0
bicycle=cv2.imread('bicycle.png',0)

以下代码将两张图片相加,结果与课程中展示的相同。但是简单的加法 avg=img1+img2 不起作用。

sumimg=cv2.add(dolphin,bicycle)
cv2.imshow('Sum image', sumimg)

两张图片未经任何修改加在一起 ​​- 冲刷区域是由于该元素的加法超过 255,因此值设置为 255

cv2.waitKey(0)
cv2.destroyAllWindows()

下面的代码只是给了我一个白色的图像。当我尝试显示半强度海豚或循环时...结果相同,但有几个黑点

avgimg=cv2.add(dolphin/2,bicycle/2)

avgimg=img1/2+img2/2

得到的结果相同
cv2.imshow('Avg image', avgimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

Udacity 课程表明,如果您按除以 2 添加图像,您应该得到:

所以问题是:当我将其中一个图像除以 2 时,矩阵包含小于 255 的值,并且两个矩阵的相加也包含小于 255 的值,为什么生成的图像是完整的冲刷?

如果您希望将两个图像合二为一(这样它们都会出现在生成的图像上),对每个输入进行平均,您应该使用 addWeighted() 方法,就像这样(取自docs):

import numpy as np
import cv2

#load your images
dolphin = cv2.imread('dolphin.png') #use 0 for grayscale
bicycle = cv2.imread('bicycle.png') 
#add them with a weight, respectively, last parameter is a scalar added 
dst = cv2.addWeighted(dolphin,0.7,bicycle,0.3,0) 

#show
cv2.imshow('Blended Image',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:在前面link中也提到过,需要注意的是numpyOpenCV的加法是不同的,因为 numpy 有模运算 (%) 而 OpenCV 有饱和运算(最大上限),为了澄清我们从 link:

中提取了这个例子
>>> x = np.uint8([250])
>>> y = np.uint8([10])

>>> print( cv2.add(x,y) ) # 250+10 = 260 => 255 , saturated
[[255]]
>>> print( x+y )          # 250+10 = 260 % 256 = 4 , modulo
[4]

这可能是您使用 add() 方法获得白色图像的原因(所有像素上限为 255 并显示白色)。