OpenCV Python图像冲洗

Omi*_*Omi 5 python opencv imshow

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

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)
Run Code Online (Sandbox Code Playgroud)

自行车-原始 海豚-原创

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

简单添加-冲洗区域

sumimg=cv2.add(dolphin,bicycle)
cv2.imshow('Sum image', sumimg)
Run Code Online (Sandbox Code Playgroud)

两张图像未经修改即添加到一起-清除区域是由于该元素的添加超过255,因此该值设置为255

cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

以下代码仅给我一张白色图片。当我尝试显示半强度的海豚或周期时...结果相同,除了一些黑点

将图像除以2

avgimg=cv2.add(dolphin/2,bicycle/2)
Run Code Online (Sandbox Code Playgroud)

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

cv2.imshow('Avg image', avgimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

Udacity课程显示,如果您将图像除以2,则应该得到以下信息: 从Udacity课程-除以2后添加了两个图像

所以问题是:当我将其中一个图像除以2时,矩阵包含的值小于255,而两个矩阵的相加也包含的值小于255,为什么生成的图像会被完全清除?

Dar*_*nus 6

如果您希望将两个图像合并为一个(因此它们都出现在结果图像上),对每个输入进行平均,您应该使用该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()
Run Code Online (Sandbox Code Playgroud)

注意:正如在前面的链接中提到的,重要的是要注意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]
Run Code Online (Sandbox Code Playgroud)

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