Обнаружение белого прямоугольника на черно-белом изображении и кадрирование (OpenCV) - PullRequest
0 голосов
/ 22 марта 2020

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

this is my original image

До сих пор я мог его ввести, преобразовать его цвета в цветовое пространство HSV и применить к нему пороговое значение. Пока это мой код:

import cv2

#Read input image
img = cv2.imread('rdm_generated_image.png')

#convert from BGR to HSV color space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

#get the saturation plane - all black/white/gray pixels are zero, and colored pixels are above zero.
s = hsv[:, :, 1]

#apply threshold on s
ret, thresh = cv2.threshold(s, 8, 255, cv2.THRESH_BINARY)

#invert colors, so every dark spots are now white
image = cv2.bitwise_not(thresh)

cv2.imwrite("image.png", image)

После этого программа выдаст следующее:

output

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

Crop it to this size

Я пробовал с этим cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) и несколько других функций, но я пока не добился успеха. Если это неправильный способ, поправьте меня. Помощь приветствуется, так как я немного неопытен с OpenCV.

Заранее спасибо!

1 Ответ

1 голос
/ 22 марта 2020

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

  • Считать изображение
  • Преобразовать в серый
  • Порог
  • Найти контуры
  • Фильтр на приблизительной ожидаемой области
  • Рисование контуров
  • Сохранение результатов

Ввод:

enter image description here

import cv2
import numpy as np

#Read input image
img = cv2.imread('boxes.png')

#convert from BGR to HSV color space
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#apply threshold
thresh = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY)[1]

# find contours and get one with area about 180*35
# draw all contours in green and accepted ones in red
contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
#area_thresh = 0
min_area = 0.95*180*35
max_area = 1.05*180*35
result = img.copy()
for c in contours:
    area = cv2.contourArea(c)
    cv2.drawContours(result, [c], -1, (0, 255, 0), 1)
    if area > min_area and area < max_area:
            cv2.drawContours(result, [c], -1, (0, 0, 255), 1)

# save result
cv2.imwrite("box_found.png", result)

# show images
cv2.imshow("GRAY", gray)
cv2.imshow("THRESH", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)


Результат:

enter image description here

...