Обрезать и преобразовать полигоны в оттенки серого - PullRequest
3 голосов
/ 18 октября 2019

У меня есть детектор текста, который выводит координаты полигона обнаруженного текста:

sample detected text

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

for i in range(0, num_box):
    pts = np.array(boxes[0][i],np.int32)
    pts = pts.reshape((-1,1,2))
    print(pts)
    print('\n')
    img2 = cv2.polylines(img,[pts],True,(0,255,0),2)
return img2

Каждый pts хранит все координаты многоугольника, для одного обнаружения текстового поля:

pts = 

[[[509 457]]

 [[555 457]]

 [[555 475]]

 [[509 475]]]

Я хотел бы преобразовать область внутри ограничивающего прямоугольникаописывается pts в градациях серого с использованием:

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Однако я не уверен, как мне предоставить аргумент image выше gray_image, поскольку я хочу преобразовать только область, описанную ptsв оттенках серого, а не на всем изображении (img2). Я хочу, чтобы остальная часть изображения была белой.

1 Ответ

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

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

Вот мое решениедобиться этого:

import cv2
import numpy as np

# Some input image
image = cv2.imread('path/to/your/image.png')

# Some pts 
pts = np.array([[60, 40], [340, 40], [340, 120], [60, 120]])

# Get extreme x, y coordinates from box
x1 = pts[0][0]
y1 = pts[0][1]
x2 = pts[1][0]
y2 = pts[2][1]

# Build output; initialize white background
image2 = 255 * np.ones(image.shape, np.uint8)
image2[y1:y2, x1:x2] = cv2.cvtColor(cv2.cvtColor(image[y1:y2, x1:x2], cv2.COLOR_BGR2GRAY), cv2.COLOR_GRAY2BGR)

# Show bounding box in original image
cv2.polylines(image, [pts], True, (0, 255, 0), 2)

cv2.imshow('image', image)
cv2.imshow('image2', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Основной «трюк» заключается в том, чтобы дважды использовать метод OpenCV cvtColor только для области интереса (ROI) изображения, впервые преобразовав BGR воттенки серого, а затем оттенки серого обратно в BGR. Доступ к прямоугольным областям интереса в «изображениях Python OpenCV» осуществляется с помощью правильной индексации массива NumPy и нарезки . Операции только с этими областями интереса поддерживаются большинством функций OpenCV (Python API).

РЕДАКТИРОВАТЬ: Если ваше конечное изображение представляет собой обычное изображение в оттенках серого, обратное преобразование, конечно, может быть опущено!

Вот несколько выходных данных, сгенерированных моим «стандартным изображением»:

Output 1

Output 2

Надеюсь, это поможет!

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