cv2.merge((r,g,b))是如何工作的?

5

我正在尝试对具有 RGB 颜色的图像进行线性滤波。 我发现一种方法是通过将图像分成不同的颜色层,然后合并它们来完成。

例如:

cv2.split(img)
Sobel(b...)
Sobel(g...)
Sobel(r...)
cv2.merge((b,g,r))

我想了解 cv2.merge((b,g,r)) 的工作原理以及最终图像是如何构建的。

2个回答

4

cv2.merge 接收单通道图像并将它们组合成多通道图像。您已经对每个通道分别运行了Sobel边缘检测算法。然后将结果组合在一起形成最终的输出图像。如果将结果组合在一起,刚开始可能在视觉上不太有意义,但您将显示所有三个平面的边缘检测结果合并到单个图像中。

理想情况下,红色色调会告诉您红色通道的边缘检测强度,绿色色调将给出绿色通道检测的强度,最后蓝色色调给出蓝色通道检测的强度。

有时这是一个好的调试工具,以便您可以语义地在单个图像中查看每个通道的所有边缘信息。然而,对于非常复杂的带有大量纹理和活动的图像来说,这很可能非常难以解释。

更常见的做法是使用彩色边缘检测算法进行边缘检测,或将图像转换为灰度图像并在该图像上进行检测。

作为前者的例子,可以将RGB图像分解为HSV,并使用此空间中的颜色信息进行更好的边缘检测。请参见Micka的这个答案:OpenCV基于颜色的边缘/边界检测


2
这是我的理解。在OpenCV中,split()函数将接收一个多通道数组的彩色图像输入,并将其拆分成几个单通道数组。
在一张图像中,每个像素都有一个顺序位置在数组中,每个像素都有自己的数组来表示(r,g和b),因此称为多通道。这种设置允许使用相同的函数拆分任何类型的图像,例如bgr、rgb或hsv。
例如(假设这些是独立的示例,因此不会覆盖变量)。
b,g,r = cv2.split(bgrImage)
r,g,b = cv2.split(rgbImage)
h,s,v = cv2.split(hsvImage)

b,g,r数组为例。每个数组都是一个单通道数组,包含拆分的RGB图像的一部分。
这意味着图像被拆分成三个单独的数组:
rgbImage[0] = [234,28,19]

r[0] = 234
g[0] = 28
b[0] = 19

rgbImage[41] = [119,240,45]
    
    r[41] = 119
    g[14] = 240
    b[14] = 45

合并通过将多个单通道数组合并在一起来完成相反的操作:
newRGBImage = cv2.merge((r,g,b))

“分离通道的顺序在此功能中变得重要。”
“伪代码:”
cv2.merge((r,g,b)) != cv2.merge((b,g,r))

顺带一提:Cv2.split() 是一个比较耗费资源的函数,使用 Numpy 的索引更加高效。
如需了解更多信息,请查看 OpenCV Python 教程

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