使用Python分析图像亮度有哪些方法?

cmc*_*nty 23 python image-processing

我想在python中进行简单的图像分析.我需要计算图像"亮度"的值.我知道PIL是用于做类似事情的goto库.有一个内置的直方图功能.

我需要的是一个"感知亮度"值我可以决定是否需要进一步调整图像.那么在这种情况下哪些基本技术会起作用呢?我应该只使用RGB值,还是直方图给我足够接近的东西?

一种可能的解决方案可能是将两者结合起来,并使用直方图生成平均R,G和B值,然后应用"感知亮度"公式.

cmc*_*nty 50

使用问题中提到的技术,我想出了几个不同的版本.

每个方法都返回一个值close,但与其他方法不完全相同.此外,除最后一个方法外,所有方法都以大致相同的速度运行,根据图像大小,速度要慢得多.

  1. 将图像转换为灰度,返回平均像素亮度.

    def brightness( im_file ):
       im = Image.open(im_file).convert('L')
       stat = ImageStat.Stat(im)
       return stat.mean[0]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将图像转换为灰度,返回RMS像素亮度.

    def brightness( im_file ):
       im = Image.open(im_file).convert('L')
       stat = ImageStat.Stat(im)
       return stat.rms[0]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 平均像素,然后转换为"感知亮度".

    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))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 像素的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))
    
    Run Code Online (Sandbox Code Playgroud)
  5. 计算像素的"感知亮度",然后返回平均值.

    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]
    
    Run Code Online (Sandbox Code Playgroud)

更新测试结果 我对200张图像进行了模拟.我发现方法#2,#4给出了几乎相同的结果.方法#3,#5也几乎相同.方法#1紧跟#3,#5(除了少数例外).

  • 只是对速度发表评论:在我的测试中,照原样进行测试,方法#2,#3和#4的速度差不多均匀(大约需要140毫秒来处理20个大小不同的图像),方法1只是略微较慢(〜180ms),而方法5确实很慢(〜3505ms)。可以预料,但是如果您在#1,#3和#5之间进行选择,则应该坚持使用#3。 (3认同)