估计图像Opencv的亮度

时间:2013-01-09 17:56:42

标签: image-processing opencv computer-vision vision

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

4 个答案:

答案 0 :(得分:15)

我想,HSV color model对你的问题有用,其中频道V是值:

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

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

答案 1 :(得分:6)

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

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

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

我的方法是:

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

比例2/3也可以增加到3/4(这会减少被视为亮的像素范围)。

该方法效果很好,因为具有相同滴定的不同细胞模式产生相似的亮度。

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

答案 2 :(得分:1)

我更喜欢Valentin's answer,但是对于确定每像素平均亮度的“另一种”方式,可以使用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)

答案 3 :(得分:0)

一些OpenCV C ++源代码,以进行细微的检查以区分亮图像和暗图像。这是受到@ ann-orlova几年前提供的上述答案的启发:

require 'spec_helper'

RSpec.shared_examples "JsonSerializerConcern" do

  dummy_class(:dummy)

  dummy_class(:dummy_serializer) do
     def self.represent(object)
     end
   end

  describe "#serialize_collection" do
    it "wraps a record in a serializer" do
      expect(dummy_serializer).to receive(:represent).with(an_instance_of(dummy)).exactly(3).times

      subject.serialize_collection [dummy.new, dummy.new, dummy.new]
    end
  end
end