Reputation: 33
I have some scanned images which vary in brightness. I desire to equalize the brightness levels to make the images (as a group) more consistent. I borrowed some code from SO (with minor changes) that was described as doing what I needed. But the code seems to have no effect at all. Obviously I’m doing something wrong but I can’t seem to figure it out. What I am trying to do is read the perceived brightness level of the original images and from that calculate a target brightness level and pass that value to a function that will (theoretically) alter the image brightness to the perceived brightness level and create a new image file.
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)
The results I get is as follows:
Page-003.png (89, 41, 89)
Page-082.png (89, 41, 89)
Page-047.png (90, 40, 89)
Page-075.png (92, 38, 91)
Page-111.png (92, 38, 91)
Page-071.png (92, 38, 92)
Page-074.png (92, 38, 92)
Page-077.png (92, 38, 92)
Page-112.png (93, 37, 93)
Page-079.png (94, 36, 93)
Page-078.png (94, 36, 94)
Page-031.png (95, 35, 95)
Page-083.png (95, 35, 95)
Page-023.png (96, 34, 96)
Page-050.png (96, 34, 96)
Page-081.png (96, 34, 96)
Page-098.png (96, 34, 96)
Page-099.png (96, 34, 96)
Page-033.png (97, 33, 96)
Page-094.png (97, 33, 97)
Page-107.png (97, 33, 97)
Page-038.png (98, 32, 98)
Page-039.png (98, 32, 98)
Page-095.png (98, 32, 98)
Page-096.png (98, 32, 98)
Page-106.png (98, 32, 98)
Page-108.png (98, 32, 98)
Page-018.png (99, 31, 99)
Page-046.png (99, 31, 99)
Page-072.png (99, 31, 99)
Page-097.png (99, 31, 99)
Page-066.png (100, 30, 99)
Page-080.png (100, 30, 99)
Page-110.png (100, 30, 99)
Page-011.png (100, 30, 100)
Page-121.png (100, 30, 100)
Page-109.png (101, 29, 100)
Page-006.png (101, 29, 101)
Page-051.png (101, 29, 101)
Page-007.png (102, 28, 102)
Page-010.png (102, 28, 102)
Page-015.png (102, 28, 102)
Page-025.png (102, 28, 102)
Page-049.png (102, 28, 102)
Page-052.png (102, 28, 102)
Page-056.png (102, 28, 102)
Page-065.png (102, 28, 102)
Page-076.png (102, 28, 102)
Page-086.png (102, 28, 102)
Page-102.png (102, 28, 102)
Page-122.png (102, 28, 102)
Page-067.png (103, 27, 102)
Page-092.png (103, 27, 102)
Page-116.png (103, 27, 102)
Page-014.png (103, 27, 103)
Page-084.png (103, 27, 103)
Page-103.png (103, 27, 103)
Page-115.png (103, 27, 103)
Page-026.png (104, 26, 103)
Page-059.png (104, 26, 103)
Page-012.png (104, 26, 104)
Page-024.png (104, 26, 104)
Page-048.png (104, 26, 104)
Page-123.png (104, 26, 104)
Page-009.png (105, 25, 105)
Page-034.png (105, 25, 105)
Page-087.png (105, 25, 105)
Page-114.png (105, 25, 105)
Page-118.png (105, 25, 105)
Page-119.png (105, 25, 105)
Page-030.png (106, 24, 105)
Page-043.png (106, 24, 105)
Page-062.png (106, 24, 105)
Page-063.png (106, 24, 105)
Page-035.png (106, 24, 106)
Page-126.png (106, 24, 106)
Page-113.png (107, 23, 106)
Page-044.png (107, 23, 107)
Page-068.png (107, 23, 107)
Page-019.png (108, 22, 107)
Page-070.png (108, 22, 107)
Page-054.png (108, 22, 108)
Page-064.png (108, 22, 108)
Page-090.png (108, 22, 108)
Page-002.png (109, 21, 108)
Page-058.png (109, 21, 108)
Page-091.png (109, 21, 108)
Page-020.png (109, 21, 109)
Page-101.png (109, 21, 109)
Page-104.png (110, 20, 109)
Page-032.png (110, 20, 110)
Page-004.png (111, 19, 111)
Page-040.png (112, 18, 111)
Page-021.png (112, 18, 112)
Page-041.png (112, 18, 112)
Page-061.png (113, 17, 113)
Page-016.png (114, 16, 114)
Page-055.png (114, 16, 114)
Page-008.png (115, 15, 114)
Page-117.png (115, 15, 115)
Page-042.png (116, 14, 116)
Page-036.png (118, 12, 117)
Page-085.png (130, 0, 129)
Page-022.png (131, -1, 131)
Page-073.png (131, -1, 131)
Page-027.png (133, -3, 132)
Page-124.png (133, -3, 132)
Page-005.png (133, -3, 133)
Page-057.png (134, -4, 133)
Page-013.png (135, -5, 135)
Page-037.png (135, -5, 135)
Page-105.png (137, -7, 137)
Page-120.png (137, -7, 137)
Page-045.png (138, -8, 138)
Page-060.png (139, -9, 139)
Page-093.png (139, -9, 139)
Page-017.png (140, -10, 140)
Page-125.png (141, -11, 140)
Page-089.png (142, -12, 141)
Page-029.png (142, -12, 142)
Page-028.png (143, -13, 142)
Page-069.png (145, -15, 145)
Page-053.png (147, -17, 146)
Page-100.png (149, -19, 149)
Page-088.png (150, -20, 149)
The first value of the tuple is the initial perceived brightness of the image. The second value is the calculated adjustment to the brightness level. The third value is the perceived brightness level of the new image file. No matter what adjustment values I try, they don't seem to have any effect. And by visually looking at the files seem to agree that they look the same as the originals.
Upvotes: 2
Views: 130
Reputation: 207853
Change the line:
cv2.add(hsv[:,:,2], value, hsv[:,:,2])
so it looks like this:
hsv[:,:,2] = cv2.add(hsv[:,:,2], value)
It doesn't work how the documentation implies - I don't know why.
Upvotes: 1