如何解决OpenCV Python-替换图像中的通道
我目前在x和y轴上使用Sobel滤波器,并为此计算一个角度。输出的图像是HSV色彩空间中两个方向的加权平均值。
我试图用计算的角度(范围[0,pi]的1d列表)替换H通道,然后如果H不为零,则将S和V通道设置为255
我用来计算角度的代码是:
Sx = cv2.Sobel(gray,-1,1,ksize=3)
Sy = cv2.Sobel(gray,ksize=3)
theta = np.arctan2(Sy,Sx)
并交换频道:
color[:,:,0] = np.rad2deg(theta)
color[color[:,0] > 0,1] = 255
color[color[:,2] = 255
我期望的结果类似于:
如果输入图像是带有黑色圆圈的白色背景
解决方法
有两个与色彩空间有关的问题(HSV和BGR,数组dtype和范围)。在大多数情况下,OpenCV希望用户注意这些事项。
-
您正在将numpy数组视为处于HSV色彩空间中,但是
cv2.imshow
将图像解释为BGR。color
数组需要显式转换为BGR,如下所示:cv2.imshow("image",cv2.cvtColor(color,cv2.COLOR_HSV2BGR))
-
如果
gray
是uint8图像,则Sx / Sy将仅包含非负值。这基本上将所有负导数设置为零,这是错误的。建议将Sobel ddepth参数更改为CV_32F(以确保输出为浮点数):Sx = cv2.Sobel(gray,cv2.CV_32F,1,ksize=3)
(对于Sy
也是如此)。或者,您可以明确确保gray.dtype
是np.float32
。 -
np.rad2deg
的输出(理论上)在[0,360]范围内,但是表示图像的numpy数组的值应在[0,255]中。这是解决这种情况的一种可能方法:
theta = np.arctan2(Sy,Sx)
# Instead of converting [-pi,pi] range to degrees,linearly convert
# the array to [0,255] range using cv2.normalize.
hue_value = cv2.normalize(theta,dst=None,alpha=255.0,norm_type=cv2.NORM_MINMAX)
# Select nonzero values as a mask.
mask = np.logical_or(theta > 0.01,theta < -0.01)
color[:,:,0] = hue_value
color[mask,1] = 255
color[mask,2] = 255
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。