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

У меня есть несколько изображений, где мне нужно динамически увеличивать или уменьшать контрастность и яркость изображения, чтобы оно было четко видно. И программа должна быть динамичной, чтобы она работала даже с новыми изображениями. Я также хочу, чтобы персонаж был темным.

Мне удалось увеличить яркость и контрастность, но это не работает должным образом для каждого изображения.

import cv2

import numpy as np

img = cv2.imread('D:\Bright.png')

image = cv2.GaussianBlur(img, (5, 5), 0)

#image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY)[1]

#kernel = np.ones((2,1),np.uint8)

#dilation = cv2.dilate(img,kernel)

cv2.imshow('test', image)

cv2.waitKey(0)

cv2.destroyAllWindows()

imghsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)


imghsv[:,:,2] = [[max(pixel - 25, 0) if pixel < 190 else min(pixel + 25, 255) for pixel in row] for row in imghsv[:,:,2]]

cv2.imshow('contrast', cv2.cvtColor(imghsv, cv2.COLOR_HSV2BGR))

#cv2.imwrite('D:\\112.png',cv2.cvtColor(imghsv, cv2.COLOR_HSV2BGR))

cv2.waitKey(0)

cv2.destroyAllWindows()

#raw_input()

Мне нужна программа, которая отлично работает для каждого изображения, а слова немного темнее, чтобы их было хорошо видно.

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

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

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

Многие графические программы имеют функцию автоматической оптимизации контраста/яркости. Это работает для вас? Вы хотите реализовать что-то подобное в opencv? Это, вероятно, основано на гистограмме. Что именно вы подразумеваете под четко видимым? Все приведенные примеры из вас кажутся очевидными, по крайней мере мне.

Trilarion 31.05.2019 12:42

@Trilarion Здесь видно четко, в основном означает, что размытие не должно присутствовать, и каждый символ по отдельности должен быть читаемым. Мне нужна помощь, чтобы реализовать его только в Opencv.

Ani 31.05.2019 14:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
1 297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как предложил Тиларион, вы можете попробовать «Автояркость и контрастность», чтобы увидеть, хорошо ли он работает. Теория, лежащая в основе этого, хорошо объяснена здесь в разделе решения. Решение находится на С++. Я написал его версию на python, которую вы можете использовать напрямую, работает только на 1 канале за раз для цветных изображений:

def auto_brightandcontrast(input_img, channel, clip_percent=1):
    histSize=180
    alpha=0
    beta=0
    minGray=0
    maxGray=0
    accumulator=[]

    if (clip_percent==0):
        #min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)
        return input_img

    else:
        hist = cv2.calcHist([input_img],[channel],None,[256],[0, 256])
        accumulator.insert(0,hist[0])    

        for i in range(1,histSize):
            accumulator.insert(i,accumulator[i-1]+hist[i])

        maxx=accumulator[histSize-1]
        minGray=0

        clip_percent=clip_percent*(maxx/100.0)
        clip_percent=clip_percent/2.0

        while(accumulator[minGray]<clip_percent[0]):
            minGray=minGray+1

        maxGray=histSize-1
        while(accumulator[maxGray]>=(maxx-clip_percent[0])):
            maxGray=maxGray-1

        inputRange=maxGray-minGray

        alpha=(histSize-1)/inputRange
        beta=-minGray*alpha

        out_img=input_img.copy()

        cv2.convertScaleAbs(input_img,out_img,alpha,beta)

        return out_img

Я использую его в своем проекте, где он терпит неудачу для вас? Или вывод не служит вашей цели?

Rakshith G B 04.06.2019 14:42

Для этого в Python Wand (который основан на ImageMagick) требуется всего несколько строк кода. Вот сценарий.

#!/bin/python3.7

from wand.image import Image    

with Image(filename='task4.jpg') as img:
    img.contrast_stretch(black_point=0.02, white_point=0.99)
    img.save(filename='task4_stretch2_99.jpg')

Вход:

Результат:

Увеличьте значение черной точки, чтобы сделать текст темнее, и/или уменьшите значение белой точки, чтобы сделать светлые части ярче.

Спасибо Эрику МакКонвиллу (разработчику Wand) за исправление моих аргументов, чтобы код заработал.

Другие вопросы по теме