Определите передний и задний цвета с помощью OpenCV

Образец снимка экрана

Я новичок в Python и OpenCV. У меня есть несколько снимков экрана (прилагается один образец для справки), для которых я хочу определить передний и задний цвет текста. Я буду использовать эти цвета для расчета цветовой контрастности текста. Используя pytesseract, я могу идентифицировать слова и нарисованные ограничивающие прямоугольники текста. Может ли кто-нибудь подсказать мне, как я могу определить передний и задний цвет текста? Ниже приведен код, который я сделал до сих пор.

import cv2
import pytesseract
import numpy as np


pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

imgOriginal = cv2.imread('3.png')

gray = cv2.cvtColor(imgOriginal, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
img = cv2.GaussianBlur(thresh, (3,3), 0)
cv2.imshow("Filtered",img)

### Detecting words
hImg,wImg,_ = imgOriginal.shape
boxes = pytesseract.image_to_data(img, config='--psm 6') #list
for i,b in enumerate(boxes.splitlines()):
    if i!=0: #no need to extract the first row since it is the header
        b=b.split()
        if len(b)==12: #12th item is the word
            x, y, w, h = int(b[6]), int(b[7]), int(b[8]), int(b[9])
            cv2.rectangle(imgOriginal, (x, y), (x+w, y+h), (0, 0, 255), 1)
            
            
cv2.imshow('Image',imgOriginal)

k = cv2.waitKey(0)
if k==ord('q'):
    cv2.destroyAllWindows()

person AJITH    schedule 23.08.2020    source источник
comment
не могли бы вы прикрепить пример изображения к вашему вопросу   -  person Tarun Chakitha    schedule 23.08.2020
comment
@SAITARUNUPPARI, скриншот я приложил. Это в основном экраны некоторых приложений Windows   -  person AJITH    schedule 23.08.2020
comment
Вы имеете в виду цвет фона, а передний цвет - это цвет текста (черный) и сероватый (пепельный) цвет фона. это оно?   -  person Tarun Chakitha    schedule 23.08.2020
comment
@ SAITARUNUPPARI, Да, у нас сотни экранов и на некоторых экранах разные цвета задней / передней панели.   -  person AJITH    schedule 24.08.2020


Ответы (1)


На случай, если вы все еще ищете ответ.

imgOriginal = cv2.imread('windows.png')
image = imgOriginal.copy()
image_1 = imgOriginal.copy()
gray = cv2.cvtColor(imgOriginal, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Removing the horizantal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), 2)

# Removing the vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,7))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), 2)

gray_no_lines = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
otsu = cv2.threshold(gray_no_lines, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

### Detecting words
boxes = pytesseract.image_to_data(otsu, config='--psm 6') #list

xs = []
ys = []
ws = []
hs = []
words = []
for i,b in enumerate(boxes.splitlines()):
    if i!=0: #no need to extract the first row since it is the header
        b=b.split()
        if len(b)==12: #12th item is the word
            if b[11] != -1:
                x, y, w, h = int(b[6]), int(b[7]), int(b[8]), int(b[9])
                cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 1)
                xs.append(x)
                ys.append(y)
                ws.append(w)
                hs.append(h)
                words.append(b[11])
text_colors = []
bg_colors = []
for j in range(len(words)):
    x,y,w,h = xs[j],ys[j],ws[j],hs[j]
    roi_otsu = otsu[y:y+h,x:x+w]
    roi_image = image_1[y:y+h,x:x+w]
        
    black_coords = np.column_stack(np.where(roi_otsu == 0))
    white_coords = np.column_stack(np.where(roi_otsu == 255))
    
    blues_text = []
    greens_text = []
    reds_text = []
    blues_bg = []
    greens_bg = []
    reds_bg = []

    for i in range(len(black_coords)):
        blue_t = roi_image.item(black_coords[i][0],black_coords[i][1],0)
        green_t = roi_image.item(black_coords[i][0],black_coords[i][1],1)
        red_t = roi_image.item(black_coords[i][0],black_coords[i][1],2)
        blues_text.append(blue_t)
        greens_text.append(green_t)
        reds_text.append(red_t)
        
    color_t = (int(np.mean(blues_text)),int(np.mean(greens_text)),int(np.mean(reds_text)))
    for i in range(len(white_coords)):
        blue_bg = roi_image.item(white_coords[i][0],white_coords[i][1],0)
        green_bg = roi_image.item(white_coords[i][0],white_coords[i][1],1)
        red_bg = roi_image.item(white_coords[i][0],white_coords[i][1],2)
        blues_bg.append(blue_bg)
        greens_bg.append(green_bg)
        reds_bg.append(red_bg)
        
    color_bg = (int(np.mean(blues_bg)),int(np.mean(greens_bg)),int(np.mean(reds_bg)))

    text_colors.append(color_t)
    bg_colors.append(color_bg)

print(text_colors)
print(bg_colors)

# print(len(text_colors),len(bg_colors))

Я удалил горизонтальные и вертикальные линии для лучших результатов. преобразовал изображение в двоичную форму и собрал координаты каждой текстовой области. нарезал интересующую вас область и собрал скоординированный пиксель текста и фона (из двоичной нарезанной области). собрал значения пикселей этих координат из цветной области. Взял среднее значение каждого цвета и добавил цвет в окончательный список.

Надеюсь, это решит вашу проблему. Пожалуйста, поправьте меня, если я ошибаюсь.

person Tarun Chakitha    schedule 28.08.2020
comment
Спасибо Таруну за ответ. Я попробую это и дам вам знать результат. - person AJITH; 28.08.2020