OpenCV Python 图像褪色问题

5
我正在尝试使用以下代码显示平均合并图像:
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)

Bycycle - original Dolphin - original

以下代码添加了两个图像,结果与课程中显示的相同。但是简单的加法avg=img1+img2不起作用。

Simple addition - washout areas

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

两张图片相加而没有任何修改 - 洗白区域是由于元素相加超过了255,因此该值被设置为255。
cv2.waitKey(0)
cv2.destroyAllWindows()

以下代码只给我一个白色图像。当我尝试显示半强度的海豚或自行车时...结果相同,除了一些黑点。

Adding images with division by 2

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

通过avgimg=img1/2+img2/2获得相同的结果

cv2.imshow('Avg image', avgimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个Udacity课程显示,如果你通过除以2来添加图像,你应该得到这个结果:From Udacity course - two images added after dividing by 2
所以问题是:当我将任意一幅图像除以2时,矩阵中包含小于255的值,两个矩阵相加也包含小于255的值,为什么最终的图像却完全失真了?

我无法上传所需的图片,因为我没有10个声望值。无论如何...当我通过首先将矩阵除以2来添加两个图像时,我得到的只是白色淡化的图像。 - Omi
那么你实际的问题是什么?你没有得到冲刷效果吗?还是它没有显示出来? - DarkCygnus
1
@Omi:您现在有10个声望值。如果您愿意,可以编辑问题并添加图片。 - Håken Lid
1个回答

7

如果您希望将两个图像合并为一个(使它们都出现在结果图像中),并且每个输入都进行平均处理,那么您应该使用addWeighted()方法,像这样(摘自文档):

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()
< p > 注意: 正如前面链接中提到的那样,需要注意的是numpyOpenCV的加法不同,因为numpy具有取模运算(%),而OpenCV具有饱和运算(上限为最大值)。为了澄清这一点,我们从该链接中提取了以下示例:

>>> 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之内,从而生成白色的颜色。

1
感谢@GrayCygnus。现在我完全明白为什么简单的加法不起作用了。我尝试了addweighted方法。它像Udacity课程中展示的那样正常工作。 - Omi
很高兴听到这个,祝你编程顺利。如果这个答案解决了你的问题,请接受它,这样其他用户也可以受益。如果你发现它有用,请记得点赞。 - DarkCygnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接