我有一些亮度不同的扫描图像。我希望均衡亮度级别以使图像(作为一个组)更加一致。我从 SO 借了一些代码(稍作改动),这些代码被描述为做我需要的事情。但是代码似乎根本没有效果。显然我做错了什么,但我似乎无法弄清楚。我想要做的是读取原始图像的感知亮度水平,并从中计算目标亮度水平并将该值传递给一个函数,该函数将(理论上)将图像亮度更改为感知亮度水平并创建一个新图像文件。
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)
元组的第一个值是图像的初始感知亮度。第二个值是对亮度级别的计算调整。第三个值是新图像文件的感知亮度级别。无论我尝试什么调整值,它们似乎都没有任何效果。并且通过视觉查看文件似乎同意它们看起来与原件相同。
慕莱坞森
相关分类