Как получить градиент яркости изображения - PullRequest
1 голос
/ 11 декабря 2019

Я работаю над пониманием изображения с помощью проверки яркости изображения, и я попытался найти яркость изображения с помощью кода ниже

def brightness( im_file ):
   im = Image.open(im_file)
   stat = ImageStat.Stat(im)
   r,g,b = stat.rms
   return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2))

Хотелось бы понять, как я могу получить полное изображение, вычисляя яркостькаждого пикселя или их набора, что-то похожее на то, что реализовано здесь на фото-криминалистике - градиент яркости


Ошибка с реализацией

import cv2
import numpy as np

im = cv2.imread('image.jpeg')  
lum = cv2.imread('image.jpeg',cv2.IMREAD_GRAYSCALE)

gradX = cv2.Sobel(lum,cv2.CV_64F,1,0,ksize=5)
gradY = cv2.Sobel(lum,cv2.CV_64F,0,1,ksize=5)

grad  = np.sqrt(gradX**2 + gradY**2)

fraction = 0.3
mixed = cv2.addWeighted(im, fraction, grad, 1.0-fraction,0)

cv2.error: OpenCV (3.4.2) /io/opencv/modules/core/src/arithm.cpp:659: ошибка: (-209: размеры входных аргументов не совпадают) Операцияне является ни «массивом операционного массива» (где массивы имеют одинаковый размер и одинаковое количество каналов), ни «массивом скалярных операций», ни «скалярным операционным массивом» в функции «arithm_op»

1 Ответ

0 голосов
/ 11 декабря 2019

Без дальнейшего описания / разъяснения от вас, я полагаю, вы хотите градиент яркости изображения. Итак, сначала нам нужно изображение яркости, а затем градиент. Обратите внимание, что приведенный ниже пример кода совсем не проверен, он просто дает общее представление о том, как действовать.

Яркость - это просто синоним изображения в оттенках серого, поэтому в зависимости от выбранной вами библиотеки вы можетеdo:

from PIL import Image
lum = Image.open('image.png'),convert('L')            # PIL method

Или:

import cv2
lum = cv2.imread('image.png',cv2.IMREAD_GRAYSCALE)    # OpenCV method

Вы также можете конвертировать в HSV и выбрать третий канал:

im = Image.open(f).convert('HSV')                     # PIL method
H, S, lum = im.split()

Или:

im = cv2.imread('image.png')                          # OpenCV method
lum = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)[...,2]

Теперь вам нужен градиент этого значения, так что это может быть Собел или Шарр:

# Calculate gradient in x-direction
gradX = cv2.Sobel(... 0,1, ...)
# And y-direction
gradY = cv2.Sobel(... 1,0, ...)
# And get combined gradient
grad  = np.sqrt(gradX**2 + gradY**2)

Похоже, что веб-сайт, на который вы ссылаетесь, смешивает это с оригиналом, я полагаюэто можно сделать с помощью чего-то вроде:

fraction = 0.3
mixed = cv2.AddWeighted(im, fraction, grad, 1.0-fraction, ...)
...