估计图像Opencv的亮度

Lak*_*nan 18 opencv image-processing vision computer-vision

我一直试图在Opencv中获得图像亮度,到目前为止我已经使用了calcHist并考虑了直方图值的平均值.但是,我觉得这不准确,因为它实际上并不确定图像的亮度.我在图像的灰度版本上执行了calcHist,并试图区分从明亮图像获得的avergae值而不是中等值的avergae值.到目前为止我还没有成功.你能帮我解决一下可以通过OpenCv实现的方法或算法来估算图像的亮度吗?提前致谢.

Ann*_*ova 18

我想,HSV颜色模型在你的问题中是有用的,其中通道V是值:

"值是颜色的亮度,随颜色饱和度而变化.范围从0到100%.当值为'0'时,颜色空间将完全变黑.随着值的增加,颜色空间亮度增加显示各种颜色."

因此,使用OpenCV方法cvCvtColor(const CvArr*src,CvArr*dst,int code)将图像从一个颜色空间转换为另一个颜色空间.在你的情况下代码= CV_BGR2HSV.然后计算第三个通道V的直方图.

  • 请注意,HSV为白色和蓝色像素分配相同的值,尽管白色像素明显比蓝色像素更亮. (7认同)
  • @Ann Orlova http://stackoverflow.com/questions/4876315/determining-image-luminance-brightness 你对此有何看法? (2认同)

Ale*_*oss 12

我更喜欢瓦伦丁的答案,但对于确定平均每像素亮度的“另一种”方法,您可以使用numpy几何平均值而不是算术平均值。对我来说它有更好的结果。

from numpy.linalg import norm

def brightness(img):
    if len(img.shape) == 3:
        # Colored RGB or BGR (*Do Not* use HSV images with this function)
        # create brightness with euclidean norm
        return np.average(norm(img, axis=2)) / np.sqrt(3)
    else:
        # Grayscale
        return np.average(img)
Run Code Online (Sandbox Code Playgroud)


Val*_*itz 7

我正要问同样的问题,但后来发现,类似的问题没有得到满意的答案.我在SO上找到的所有答案都涉及人类对单像素RGB与HSV的观察.

根据我的观察,图像的主观亮度也很大程度上取决于图案.白天,黑暗天空中的恒星看起来可能比多云天空更亮,而第一图像的平均像素值将小得多.

我使用的图像是由显微镜产生的灰度细胞图像.形式差异很大.有时它们是非常黑的背景上的小亮点,有时在不那么黑的背景下不那么明亮的较大区域.

我的方法是:

  • 使用阈值查找最大直方图(HMax)以移除热像素.
  • 计算HMax*2/3和HMax之间所有像素的平均值

比率2/3也可以增加到3/4(这减小了被视为亮的像素范围).

该方法非常有效,因为具有相同滴定的不同细胞模式产生相似的亮度.

PS:我实际想问的是,在OpenCV或SimpleCV中是否存在类似的计算功能.非常感谢任何评论!

  • 我们使用的基本相同,但中位数却相反. (2认同)