所以我想创建一个加权的直方图,因为我有一些比其他像素更重要的像素。例如,我想让中心区域像素的重量大于边框上的像素。
我目前正在使用opencv cascadeClassifier检测一个对象,并使用numpy生成目标的直方图,但我想让中心区域的像素比边框上的其他像素更重。
例如:
def generateHistogram(self,img):
hist,bins = np.histogram(img.flatten(),256,[0,256])
self.hist = hist
#print hist
return hist
那我怎么能这样做?它被称为加权直方图还是有其他名称?
非常感谢!!!
答案 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_kde
或sklearn.neighbors.kde.KernelDensity
获取更多信息。