【问题标题】:Plotting a histogram to figure out maximum intensity of gradients on an image绘制直方图以计算图像上梯度的最大强度
【发布时间】:2020-01-10 03:32:45
【问题描述】:

我有这张图片,

我想在其中使用sobel滤波器进行梯度计算:

kx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], np.float32)
ky = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], np.float32)

ix = ndimage.filters.convolve(img, kx)
iy = ndimage.filters.convolve(img, ky)

g = np.hypot(ix, iy)
g = g / g.max() * 255
theta = np.arctan2(iy, ix)

我想将g 值绘制成直方图,以找出图像中渐变强度的范围。当我尝试histr = cv2.calcHist([g], [0], None, [256], [0, 256]) 时,它给了我以下错误:

TypeError:不支持图像数据类型 = 23

我想知道,如何在直方图中绘制梯度强度来确定范围。

【问题讨论】:

    标签: python opencv image-processing histogram gradient


    【解决方案1】:

    如错误消息所示,g 的类型似乎不受支持。我们来看看cv2.calcHist的文档:

    图像 源数组。它们都应该具有相同的深度、CV_8U、CV_16U 或 CV_32F,以及相同的大小。它们中的每一个都可以有任意数量的通道。

    按原样运行您的代码,g 的类型为 np.float16。因此,以下所有更正都有效:

    histr = cv2.calcHist([g.astype(np.uint8)], [0], None, [256], [0, 256])
    
    histr = cv2.calcHist([g.astype(np.uint16)], [0], None, [256], [0, 256])
    
    histr = cv2.calcHist([g.astype(np.float32)], [0], None, [256], [0, 256])
    

    只需选择最适合您需求的。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2018-05-31
      • 1970-01-01
      • 2016-07-23
      • 2014-04-02
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多