cmc*_*nty 23 python image-processing
我想在python中进行简单的图像分析.我需要计算图像"亮度"的值.我知道PIL是用于做类似事情的goto库.有一个内置的直方图功能.
我需要的是一个"感知亮度"值我可以决定是否需要进一步调整图像.那么在这种情况下哪些基本技术会起作用呢?我应该只使用RGB值,还是直方图给我足够接近的东西?
一种可能的解决方案可能是将两者结合起来,并使用直方图生成平均R,G和B值,然后应用"感知亮度"公式.
cmc*_*nty 50
使用问题中提到的技术,我想出了几个不同的版本.
每个方法都返回一个值close,但与其他方法不完全相同.此外,除最后一个方法外,所有方法都以大致相同的速度运行,根据图像大小,速度要慢得多.
将图像转换为灰度,返回平均像素亮度.
def brightness( im_file ):
   im = Image.open(im_file).convert('L')
   stat = ImageStat.Stat(im)
   return stat.mean[0]
将图像转换为灰度,返回RMS像素亮度.
def brightness( im_file ):
   im = Image.open(im_file).convert('L')
   stat = ImageStat.Stat(im)
   return stat.rms[0]
平均像素,然后转换为"感知亮度".
def brightness( im_file ):
   im = Image.open(im_file)
   stat = ImageStat.Stat(im)
   r,g,b = stat.mean
   return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2))
像素的RMS,然后转换为"感知亮度".
def brightness( im_file ):
   im = Image.open(im_file)
   stat = ImageStat.Stat(im)
   r,g,b = stat.rms
   return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2))
计算像素的"感知亮度",然后返回平均值.
def brightness( im_file ):
   im = Image.open(im_file)
   stat = ImageStat.Stat(im)
   gs = (math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
         for r,g,b in im.getdata())
   return sum(gs)/stat.count[0]
更新测试结果 我对200张图像进行了模拟.我发现方法#2,#4给出了几乎相同的结果.方法#3,#5也几乎相同.方法#1紧跟#3,#5(除了少数例外).