【问题标题】:Generating & Plotting Histograms of Gradient Magnitude & Orientation生成和绘制梯度大小和方向的直方图
【发布时间】:2017-05-19 05:47:07
【问题描述】:

使用matplotlib 如何生成和显示图像梯度大小和方向的直方图?

我不知道的一件事是 x 轴限制;幅度应该是0到1吗?即,边缘的强度在 0 和 1 之间?对于方向,我假设 x 轴范围为 0 到 360(度)还是应该做弧度?

以下是我如何生成渐变、幅度和方向。我现在如何将每个显示为直方图?

def get_gradient(src):

    sobelx = cv2.Sobel(src,cv2.CV_64F,1,0,ksize=5)
    sobely = cv2.Sobel(src,cv2.CV_64F,0,1,ksize=5)

    grad = sobelx + sobely
    mag = cv2.magnitude(sobelx, sobely)  # so my Mat element values could be anything between 0 and 1???
    ori = cv2.phase(sobelx, sobely, True) # so my Mat element values could be anything between 0 and 360 degrees???
    return [grad, mag, ori]

grad_res = get_gradient(src)

# number of bins is 100 from 0 to 1. Ie, 0.001, 0.002, ... 1.000 
# am I correct?
mag_hist = cv2.calcHist([grad_res[1]],[0],None,[100],[0,1]) 

ori_hist = cv2.calcHist([grad_res[2]],[0],None,[360],[0,360]) 

plt.plot(mag_hist)
plt.xlim([0,1])

plt.plot(ori_hist)
plt.xlim([0,360])

plt.show()

编辑:上述代码的当前错误:

mag_hist = cv2.calcHist([梯度[1]],[0],无,[10],[0,100]) 错误:C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp:1422:错误:(-210) in function cv::calcHist

【问题讨论】:

  • 同时附上当前输出和预期输出?
  • @ZdaR 我已经添加了错误输出。预期的输出是绘制的直方图。
  • @AlexanderReynolds 谢谢,我会调查的。关于我的幅度 Mat - 梯度幅度值(0-1 或 0-255、0-n)的值范围是多少?即cv2.magnitude(sobelx, sobely)的输出
  • @JakeM 抱歉,我删除了评论,因为他们正在重新创建垃圾箱并绘制它们,但它没有回答您发布的问题。但是,我发布的答案应该可以帮助您! :)

标签: python opencv matplotlib


【解决方案1】:

您返回的是 64 位浮点数,calcHist 不支持。您需要将它们转换为 32 位浮点数。将cv2.Sobel() 调用中的类型更改为cv2.CV_32F 或使用[grad_res[1].astype('float32')] 作为cv2.calcHist() 中的参数。

来自OpenCV docs:
images – 源数组。它们都应该具有相同的深度,CV_8UCV_32F,以及相同的大小。它们中的每一个都可以有任意数量的通道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 2013-06-22
    • 2011-11-30
    • 2016-07-23
    • 1970-01-01
    • 2012-07-15
    • 2011-08-01
    相关资源
    最近更新 更多