使用python制作加权直方图?

问题描述 投票:0回答:3

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

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

例如:

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

那我该怎么办呢?它被称为加权直方图还是有其他名称?

非常感谢!!!

python opencv image-processing computer-vision histogram
3个回答
0
投票

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

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

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

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

这里要注意的一件事是你可能想要将结果值归一化到0-256之间(如果使用更多颜色则更大)以避免溢出错误。


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)

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.