我正在尝试对具有 RGB 颜色的图像进行线性滤波。 我发现一种方法是通过将图像分成不同的颜色层,然后合并它们来完成。
例如:
cv2.split(img)
Sobel(b...)
Sobel(g...)
Sobel(r...)
cv2.merge((b,g,r))
我想了解 cv2.merge((b,g,r))
的工作原理以及最终图像是如何构建的。
我正在尝试对具有 RGB 颜色的图像进行线性滤波。 我发现一种方法是通过将图像分成不同的颜色层,然后合并它们来完成。
例如:
cv2.split(img)
Sobel(b...)
Sobel(g...)
Sobel(r...)
cv2.merge((b,g,r))
我想了解 cv2.merge((b,g,r))
的工作原理以及最终图像是如何构建的。
cv2.merge
接收单通道图像并将它们组合成多通道图像。您已经对每个通道分别运行了Sobel边缘检测算法。然后将结果组合在一起形成最终的输出图像。如果将结果组合在一起,刚开始可能在视觉上不太有意义,但您将显示所有三个平面的边缘检测结果合并到单个图像中。
理想情况下,红色色调会告诉您红色通道的边缘检测强度,绿色色调将给出绿色通道检测的强度,最后蓝色色调给出蓝色通道检测的强度。
有时这是一个好的调试工具,以便您可以语义地在单个图像中查看每个通道的所有边缘信息。然而,对于非常复杂的带有大量纹理和活动的图像来说,这很可能非常难以解释。
更常见的做法是使用彩色边缘检测算法进行边缘检测,或将图像转换为灰度图像并在该图像上进行检测。
作为前者的例子,可以将RGB图像分解为HSV,并使用此空间中的颜色信息进行更好的边缘检测。请参见Micka的这个答案:OpenCV基于颜色的边缘/边界检测。
b,g,r = cv2.split(bgrImage)
r,g,b = cv2.split(rgbImage)
h,s,v = cv2.split(hsvImage)
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))