我有一些扫描的图像,其亮度有所不同。我希望均衡亮度级别,以使图像(作为一组)更加一致。我从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)
元组的第一个值是图像的初始感知亮度。第二个值是对亮度水平的计算调整。第三个值是新图像文件的感知亮度级别。无论我尝试什么调整值,它们似乎都没有作用。通过肉眼观察这些文件似乎同意它们看起来与原始文件相同。
答案 0 :(得分:1)
更改行:
cv2.add(hsv[:,:,2], value, hsv[:,:,2])
所以看起来像这样:
hsv[:,:,2] = cv2.add(hsv[:,:,2], value)
文档的含义不起作用-我不知道为什么。