CGregg
CGregg

Reputation: 33

Why can't I adjust the brightness levels of a PNG file

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

Answers (1)

Mark Setchell
Mark Setchell

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

Related Questions