使用python制作加权直方图?

时间:2014-11-11 23:55:55

标签: python opencv image-processing computer-vision histogram

所以我想创建一个加权的直方图,因为我有一些比其他像素更重要的像素。例如,我想让中心区域像素的重量大于边框上的像素。

我目前正在使用opencv cascadeClassifier检测一个对象,并使用numpy生成目标的直方图,但我想让中心区域的像素比边框上的其他像素更重。

例如:

def generateHistogram(self,img):
    hist,bins = np.histogram(img.flatten(),256,[0,256])
    self.hist = hist
    #print hist
    return hist

那我怎么能这样做?它被称为加权直方图还是有其他名称?

非常感谢!!!

3 个答案:

答案 0 :(得分:1)

当我尝试构建图像渐变阶段的加权直方图时,我遇到了同样的问题:强梯度应该比弱梯度具有更大的权重。我发现NumPy有histogram函数的适当标志:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html#numpy.histogram

所以我用以下代码解决了我的问题:

import cv2
import numpy as np

# see tau manifest
TAU = np.pi * 2

# load image
#..

# calculate gradient
gradX = cv2.Scharr(image, ddepth=cv2.CV_32F, dx=1, dy=0)
gradY = cv2.Scharr(image, ddepth=cv2.CV_32F, dx=0, dy=1)

# calculate magnitude and phase
magnitude = cv2.magnitude(gradX, gradY)
phase = cv2.phase(gradX, gradY)

# build weighted histogram of phase
hist, bins = np.histogram(phase, bins=360, range=[0, TAU], weights=magnitude)

答案 1 :(得分:0)

如果你只是需要一些工作而不用担心这种方法,我会做什么,在宽度和高度上首先获得图像的大小。现在你知道中心在哪里,让我们说(x,y)像素。

为要进行特殊处理的像素定义阈值(t)和权重(w)。

这里的复杂程度非常差,但根据你选择的图像大小和阈值,它可能并不全是坏事。简而言之,它将是这样的:

浏览距离图像中心最多(t)像素的所有像素  使用权重标准化(t * w)修改它们的值

此处需要注意的一点是,您可能希望将结果值标准化为0-256(如果使用更多颜色,则更大),以避免溢出错误。

答案 2 :(得分:0)

您希望通过高斯或Epanechnikov内核等核函数运行每个像素,以获得加权的颜色分布。这是在平均移位跟踪中完成的。可以在第7页找到精确的公式here

我不知道opencv中只有直方图部分的任何函数,但您可以参考scipy.stats.gaussian_kdesklearn.neighbors.kde.KernelDensity获取更多信息。