python - OpenCV Python - 替换图像中的 channel

标签 python numpy opencv computer-vision

我目前在 x 和 y 轴上使用 Sobel 滤波器并为此计算一个角度。输出图像是 HSV 颜色空间中两个方向的加权平均值。
我正在尝试用计算出的角度([0,pi] 范围内的一维列表)替换 H channel ,然后如果 H 不为零,则将 S 和 V channel 设置为 255
我用来计算角度的代码是:

 Sx = cv2.Sobel(gray, -1, 1, 0, ksize=3)
 Sy = cv2.Sobel(gray, -1, 0, 1, ksize=3)
 theta = np.arctan2(Sy, Sx)
并交换 channel :
color[:,:,0] = np.rad2deg(theta)
color[color[:, :, 0] > 0, 1] = 255
color[color[:, :, 0] > 0, 2] = 255
在交换 channel 之前,我有:
before
但交换后我得到:
after
我的预期结果类似于:
enter image description here
如果输入图像是带有黑色圆圈的白色背景

最佳答案

有几个与色彩空间相关的问题(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, 0, ksize=3) (对于 Sy 也是如此)。或者您可以明确确保 gray.dtypenp.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
    

    关于python - OpenCV Python - 替换图像中的 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63542814/

    相关文章:

    python - numpy:比较两个日期值返回 TypeError: '>=' 和 'int' 的实例之间不支持 'datetime.datetime'

    python - 在 sklearn 中调整超参数后查找模型的准确性、精确度和召回率

    python - Numpy:如何基于子矩阵 B 返回矩阵 A 的 View

    python - 托普利兹矩阵的托普利兹矩阵

    python - 如何从直方图均衡图像中去除噪声?

    python - 无法从 airflow pod 中提取 xcom - Kubernetes Pod Operator

    python - 检测 python 中的文件句柄泄漏?

    android - 将 Python 代码移植到 Android

    python - 如何加快 python 中的数组生成速度?

    java - 如何将像素数组存储到二维数组中?