Как автоматически настроить контраст и яркость отсканированного изображения с помощью opencv python - PullRequest
0 голосов
/ 04 августа 2020

Я хочу автоматически настроить яркость и контраст цветного изображения, снятого с телефона при различных условиях освещения. Пожалуйста, помогите мне, я новичок в OpenCV.

Источник: Входное изображение

Результат: результат

Что я ищу for - это скорее локализованное преобразование. По сути, я хочу, чтобы тень стала как можно более светлой, если это возможно, полностью исчезла и чтобы более темные пиксели изображения стали темнее, более контрастными, а светлые пиксели - более белыми, но не до такой степени, чтобы они были переэкспонированы или что-то в этом роде. вот так.

Я пробовал CLAHE, Histogram Equalization, Binary Thresholding, Adaptive Thresholding, и т. д. c Но ничего не получилось.

Мои инициалы думают, что мне нужно чтобы нейтрализовать Highlights и приблизить более темные пиксели к среднему значению, сохраняя при этом текст и строки как можно более темными. А потом, возможно, сделаю контрастный фильтр. Но я не могу получить результат, пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Вот один из способов сделать это в Python / OpenCV.

  • Прочитать ввод
  • Увеличить контраст
  • Преобразовать оригинал в оттенки серого
  • Адаптивный порог
  • Используйте пороговое изображение, чтобы сделать фон белым на изображении с повышенной контрастностью
  • Сохранить результаты

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread("math_diagram.jpg")

# convert img to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# do adaptive threshold on gray image
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 21, 15)

# make background of input white where thresh is white
result = img.copy()
result[thresh==255] = (255,255,255)

# write results to disk
cv2.imwrite("math_diagram_threshold.jpg", thresh)
cv2.imwrite("math_diagram_processed.jpg", result)

# display it
cv2.imshow("THRESHOLD", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)

Threshold image:

enter image description here

Result:

введите описание изображения здесь

0 голосов
/ 04 августа 2020

Вы можете использовать любой локальный метод бинаризации. В OpenCV есть один такой метод, называемый локальной бинаризацией Вольфа-Джулиона, который можно применить к входному изображению. Ниже приведен фрагмент кода в качестве примера:

import cv2

image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)[:,:,2]

T = cv2.ximgproc.niBlackThreshold(gray, maxValue=255, type=cv2.THRESH_BINARY_INV, blockSize=81, k=0.1, binarizationMethod=cv2.ximgproc.BINARIZATION_WOLF)
grayb = (gray > T).astype("uint8") * 255

cv2.imshow("Binary", grayb)
cv2.waitKey(0)

Результат вывода приведенного выше кода приведен ниже. Обратите внимание, что для использования модуля ximgproc вам необходимо установить пакет opencv contrib.

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...