Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x OpenCV合并无法合并图像通道_Python 3.x_Numpy_Opencv - Fatal编程技术网

Python 3.x OpenCV合并无法合并图像通道

Python 3.x OpenCV合并无法合并图像通道,python-3.x,numpy,opencv,Python 3.x,Numpy,Opencv,我试图将高斯噪声添加到图像的单个通道中 将cv2作为cv导入 将numpy作为np导入 img1=cv.imread('input/foo.png') img1_蓝色、img1_绿色、img1_红色=等速分割(img1) img1_h,img1_w,u=img1.shape s=5 噪声=np.随机.正常(0,s,(img1_h,img1_w)) img1\u gn=img1\u绿色+噪音 打印(img1_green.shape)#(512,384) 打印(图像形状)#(512384) 打印(i

我试图将高斯噪声添加到图像的单个通道中

将cv2作为cv导入
将numpy作为np导入
img1=cv.imread('input/foo.png')
img1_蓝色、img1_绿色、img1_红色=等速分割(img1)
img1_h,img1_w,u=img1.shape
s=5
噪声=np.随机.正常(0,s,(img1_h,img1_w))
img1\u gn=img1\u绿色+噪音
打印(img1_green.shape)#(512,384)
打印(图像形状)#(512384)
打印(img1_蓝色形状)#(512,384)
img1_g_noise=cv.merge((img1_蓝色、img1_gn、img1_红色))
这将导致以下错误:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-34-049cf9e65133> in <module>
     13 
---> 14 img1_g_noise = cv.merge((img1_blue, img1_gn, img1_red))
     15 

error: OpenCV(3.4.5) /io/opencv/modules/core/src/merge.cpp:293: error: (-215:Assertion failed) mv[i].size == mv[0].size && mv[i].depth() == depth in function 'merge'
---------------------------------------------------------------------------
错误回溯(最近一次呼叫上次)
在里面
13
--->14 img1\U g\U噪声=cv.合并((img1\U蓝色、img1\U gn、img1\U红色))
15
错误:OpenCV(3.4.5)/io/OpenCV/modules/core/src/merge.cpp:293:错误:(-215:断言失败)mv[i]。size==mv[0]。size&&mv[i]。depth()==函数“merge”中的深度

我不知道这是怎么发生的,为什么会发生。产生的噪声绿色通道的尺寸和类型与其他两个通道相同。重新组合原始的绿色通道效果很好。感谢您提供任何指导方向。

这是因为噪声和通道数据类型不匹配。numpy矩阵的默认数据类型为numpy.float64。您必须通过将
.astype(img1_blue.dtype)
添加到噪声防御中来定义rach通道类型中的噪声

编辑代码:

import cv2 as cv
import numpy as np

img1 = cv.imread('list.JPG')
img1_blue, img1_green, img1_red = cv.split(img1)
img1_h, img1_w, _ = img1.shape

s = 5
noise = np.random.normal(0, s, (img1_h, img1_w)).astype(img1_blue.dtype)
img1_gn = img1_green + noise

print(img1_green.shape) # (512, 384)
print(img1_gn.shape)    # (512, 384)
print(img1_blue.shape)  # (512, 384)

img1_g_noise = cv.merge((img1_blue, img1_gn, img1_red))
cv.imshow("img1_g_noise",img1_g_noise)
cv2.waitKey()

这是因为噪声和通道数据类型不匹配。numpy矩阵的默认数据类型为numpy.float64。您必须通过将
.astype(img1_blue.dtype)
添加到噪声防御中来定义rach通道类型中的噪声

编辑代码:

import cv2 as cv
import numpy as np

img1 = cv.imread('list.JPG')
img1_blue, img1_green, img1_red = cv.split(img1)
img1_h, img1_w, _ = img1.shape

s = 5
noise = np.random.normal(0, s, (img1_h, img1_w)).astype(img1_blue.dtype)
img1_gn = img1_green + noise

print(img1_green.shape) # (512, 384)
print(img1_gn.shape)    # (512, 384)
print(img1_blue.shape)  # (512, 384)

img1_g_noise = cv.merge((img1_blue, img1_gn, img1_red))
cv.imshow("img1_g_noise",img1_g_noise)
cv2.waitKey()

这就是
dtype
问题

默认情况下,
image\u blue
image\u red
uint8
类型; 但是
噪声
float16
类型


解决方案1

您可以通过以下方式将
噪音
更改为“unit8”类型:

noise = noise.astype('image_red.type')
但这会让噪音损失很多信息


解决方案2

您还可以通过添加以下两行,将所有rgb通道更改为
float16
dtype:

img1_blue = img1_blue.astype(img1_gn.dtype)
img1_red = img1_red.astype(img1_gn.dtype)

这就是
dtype
问题

默认情况下,
image\u blue
image\u red
uint8
类型; 但是
噪声
float16
类型


解决方案1

您可以通过以下方式将
噪音
更改为“unit8”类型:

noise = noise.astype('image_red.type')
但这会让噪音损失很多信息


解决方案2

您还可以通过添加以下两行,将所有rgb通道更改为
float16
dtype:

img1_blue = img1_blue.astype(img1_gn.dtype)
img1_red = img1_red.astype(img1_gn.dtype)