为什么我不能调整PNG文件的亮度级别

时间:2019-09-03 17:58:07

标签: python python-3.x opencv image-processing

我有一些扫描的图像,其亮度有所不同。我希望均衡亮度级别,以使图像(作为一组)更加一致。我从SO借了一些代码(进行了一些小的更改),这些代码被描述为满足我的需要。但是代码似乎根本没有任何作用。显然我做错了,但似乎无法解决。我要尝试做的是读取原始图像的感知亮度水平,然后从中计算目标亮度水平,并将该值传递给一个函数,该函数将(理论上)将图像亮度更改为感知亮度水平并创建新图像文件。

import UIKit

@IBDesignable class TagPerson: ShadowRoundedImageView {

    override var intrinsicContentSize: CGSize {
        var s = super.intrinsicContentSize
        s.height = 40
        s.width = 40
        return s
    }

    override func prepareForInterfaceBuilder() {
        invalidateIntrinsicContentSize()
    }

}

我得到的结果如下:

from os import listdir
import numpy as np
import cv2
from PIL import Image, ImageStat
import operator
import math

def brightness(fname):
    with Image.open(fname) as img:
        stat = ImageStat.Stat(img)
        r,g,b = stat.mean

    return int(math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)))


def change_brightness(fname, value):
    if value == 0: return
    img = cv2.imread(SourceDir+fname,)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    cv2.add(hsv[:,:,2], value, hsv[:,:,2])

    img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    cv2.imwrite(DestDir+fname, img)


SourceDir = 'I:\\'
DestDir = 'G:\\Documents\\'
InputFiles = []
BrightnessLevels = {}
TargetBrightness = 130

InputFiles = listdir(SourceDir)
try:
    InputFiles.remove('System Volume Information')
except:
    pass

InputFiles.sort()

for InputFile in InputFiles:
    old_b = brightness(SourceDir+InputFile)
    change = TargetBrightness-old_b
    change_brightness(InputFile, change)
    new_b = brightness(DestDir+InputFile)
    BrightnessLevels[InputFile] = (old_b, change, new_b)

sorted_b = sorted(BrightnessLevels.items(), key=operator.itemgetter(1))
for f,b in sorted_b:
    print(f,b)

元组的第一个值是图像的初始感知亮度。第二个值是对亮度水平的计算调整。第三个值是新图像文件的感知亮度级别。无论我尝试什么调整值,它们似乎都没有作用。通过肉眼观察这些文件似乎同意它们看起来与原始文件相同。

1 个答案:

答案 0 :(得分:1)

更改行:

cv2.add(hsv[:,:,2], value, hsv[:,:,2])

所以看起来像这样:

hsv[:,:,2] = cv2.add(hsv[:,:,2], value)

文档的含义不起作用-我不知道为什么。