使用python制作加权直方图?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python制作加权直方图?相关的知识,希望对你有一定的参考价值。
所以我想创建一个加权的直方图,因为我有一些比其他像素更重要的像素。例如,我想让中心区域像素的重量大于边框上的像素。
我目前正在使用opencv cascadeClassifier检测一个对象,并使用numpy生成目标的直方图,但我想让中心区域的像素比边框上的其他像素更重。
例如:
def generateHistogram(self,img):
hist,bins = np.histogram(img.flatten(),256,[0,256])
self.hist = hist
#print hist
return hist
那我该怎么办呢?它被称为加权直方图还是有其他名称?
非常感谢!!!
如果你只是需要一些工作而不用担心这种方法,我会做什么,在宽度和高度上首先获得图像的大小。现在你知道中心在哪里,让我们说(x,y)像素。
为要进行特殊处理的像素定义阈值(t)和权重(w)。
这里的复杂程度非常差,但根据您选择的图像大小和阈值,它可能并不全是坏事。简而言之,它将是这样的:
浏览距离图像中心最多(t)像素的所有像素,使用权重标准化(t * w)修改其值
这里要注意的一件事是你可能想要将结果值归一化到0-256之间(如果使用更多颜色则更大)以避免溢出错误。
当我尝试构建图像渐变阶段的加权直方图时,我遇到了同样的问题:强梯度应该比弱梯度具有更大的权重。我发现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)
你想要的是通过高斯或Epanechnikov内核等核函数运行每个像素,以获得加权的颜色分布。这是在平均移位跟踪中完成的。确切的公式可以在第7页找到here。
我不知道opencv中只有直方图部分的任何函数,但你可以参考scipy.stats.gaussian_kde
或sklearn.neighbors.kde.KernelDensity
for更多信息。
以上是关于使用python制作加权直方图?的主要内容,如果未能解决你的问题,请参考以下文章