Как выровнять освещение на цветных изображениях? - PullRequest
1 голос
/ 30 октября 2019

Я работаю над фильтром изображения, но для его правильной работы мне нужно выровнять молнию на изображении. Исходное изображение | Выходное изображение из-за проблем с освещением. | Вывод, когда молния одинакова по всему изображению. Я пробовал этот код:

import cv2
import numpy as np
img = cv2.imread('new_sample/sample6.jpg', 1)
original = img.copy()
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8, 8))
cl = clahe.apply(l)
limg = cv2.merge((cl, a, b))
final = cv2.cvtColor(limg, cv2.COLOR_LAB2BGR)
kernel_sharpen_3 = np.array([[-1, -1, -1, -1, -1]                      
    [-1, 2, 2, 2, -1],
    [-1, 2, 8, 2, -1],
    [-1, 2, 2, 2, -1],
    [-1, -1, -1, -1, -1]]) / 8
img = cv2.filter2D(final, -1, kernel_sharpen_3)
ret, thresh1 = cv2.threshold(img, 110, 255, cv2.THRESH_BINARY)
threshold = cv2.fastNlMeansDenoising(thresh1, 11, 31, 9) 
blur = cv2.GaussianBlur(threshold, (5, 5), 0)
stack_horizontal = np.concatenate((original, final), axis=1)
stack_horizontal2 = np.concatenate((threshold, blur), axis=1)
stack_vertical = np.concatenate((stack_horizontal, stack_horizontal2), 
axis=0)
cv2.imshow('Images', cv2.resize(stack_vertical, (700, 1000)))
cv2.imwrite("magic.jpg", blur)
cv2.waitKey()
cv2.destroyAllWindows()

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вот одна идея в Python / OpenCV. Выполните адаптивное определение порога, а затем раскрасьте белый в средний цвет оригинала.

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread("purple_text.jpg")
h, w, c = img.shape

# get average color of img
color = cv2.mean(img)[0:3]

# 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, 13)
thresh3 = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)

# change white to color
result1 = thresh3.copy()
result1[thresh==255] = color

# optionally colorize text darker and more blue
result2 = result1.copy()
result2[thresh==0] = (color[0],0.65*color[1],0.65*color[2])

# write results to disk
cv2.imwrite("purple_text_processed1.jpg", result1)
cv2.imwrite("purple_text_processed2.jpg", result2)

# display it
cv2.imshow("IMAGE", img)
cv2.imshow("THRESHOLD", thresh)
cv2.imshow("RESULT1", result1)
cv2.imshow("RESULT2", result2)
cv2.waitKey(0)

Цвет фона:

enter image description here

Цвет фона и текста:

enter image description here

ДОПОЛНЕНИЕ:

Вот лучший вариант, который получает средний цвет фона и текста и окрашивает один или оба из них из адаптивного порога.

import cv2
import numpy as np

# read image
img = cv2.imread("purple_text.jpg")
h, w, c = img.shape

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

# do adaptive threshold on gray image to make a mask
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 21, 13)

# get color of image where thresh is 255
bgcolor = cv2.mean(img, thresh)[0:3]

# get color where thresh is 0
textcolor = cv2.mean(img, 255-thresh)[0:3]

# put colorize background and text with bgcolor and color, resp.
result = img.copy()
result[thresh==255] = bgcolor
result[thresh==0] = textcolor

# write results to disk
cv2.imwrite("purple_text_processed3.jpg", result)

# optionally darken text COLOR_BGR2GRAY
resultx = img.copy()
resultx[thresh==255] = bgcolor
resultx[thresh==0] = (0.75*textcolor[0], 0.75*textcolor[1], 0.75*textcolor[2])

# write results to disk
cv2.imwrite("purple_text_processed3x.jpg", resultx)

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

Цветной текст и фон:

enter image description here

Цветной и затемненный текст и фон:

enter image description here

0 голосов
/ 30 октября 2019

Попробуйте приведенный ниже код. если не хорошо, попробуйте бинаризацию Оцу.

import cv2
import numpy as np

img = cv2.imread('bookpage.jpg')
th = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
cv2.imshow('original',img)
cv2.imshow('Adaptive threshold',th)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...