我一直试图在Opencv中获得图像亮度,到目前为止我已经使用了calcHist并考虑了直方图值的平均值。但是,我觉得这不准确,因为它实际上并不确定图像的亮度。我在图像的灰度版本上执行了calcHist,并试图区分从明亮图像获得的avergae值而不是温和图像的avergae值。到目前为止我还没有成功。你能帮我解决一下可以通过OpenCv实现的方法或算法来估算图像的亮度吗?提前谢谢。
答案 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的观察。
根据我的观察,图像的主观亮度也很大程度上取决于图案。白天,黑暗天空中的恒星看起来可能比多云天空更亮,而第一张图像的平均像素值会小得多。
我使用的图像是由显微镜产生的灰度细胞图像。形式差异很大。有时它们是非常黑的背景上的小亮点,有时在不那么黑的背景下不那么明亮的较大区域。
我的方法是:
比例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