Как обрезать ограничивающую рамку из изображения - PullRequest
0 голосов
/ 14 мая 2018

Чтобы немного объяснить вопрос. У меня есть изображение, которое уже содержит белую ограничивающую рамку, как показано здесь: Входное изображение

Мне нужно обрезать часть изображения, окруженную ограничительной рамкой.

FindContours здесь не работает, поэтому я попробовал что-то, используя следующий код:

import cv2
import numpy as np

bounding_box_image = cv2.imread('PedestrianRectangles/1/grim.pgm')

edges = cv2.Canny(bounding_box_image, 50, 100)  # apertureSize=3

cv2.imshow('edge', edges)
cv2.waitKey(0)

lines = cv2.HoughLinesP(edges, rho=0.5, theta=1 * np.pi / 180, 
threshold=100, minLineLength=100, maxLineGap=50)

# print(len(lines))

for i in lines:
    for x1, y1, x2, y2 in i:
        # print(x1, y1, x2, y2)
        cv2.line(bounding_box_image, (x1, y1), (x2, y2), (0, 255, 0), 2)

cv2.imwrite('houghlines5.jpg', bounding_box_image)

безуспешно. Игра с параметрами также не сильно помогла. Результат моего фрагмента кода показан на следующем изображении: выход

У меня была идея сделать обрезку после обнаружения линии и т. Д.

Я относительно новичок в opencv, поэтому помощь будет принята с благодарностью. Есть ли хороший или простой подход к этой проблеме, который мне не хватает? Поиск в Google не помог, поэтому любые ссылки, фрагменты кода были бы полезны.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Благодаря Silencer, с его помощью мне удалось заставить его работать, поэтому я предоставлю код и надеюсь, что он поможет другим людям:

import cv2
import numpy as np

bounding_box_image = cv2.imread('PedestrianRectangles/1/grim.pgm')
grayimage = cv2.cvtColor(bounding_box_image, cv2.COLOR_BGR2GRAY)

ret, mask = cv2.threshold(grayimage, 254, 255, cv2.THRESH_BINARY)

cv2.imshow('mask', mask)
cv2.waitKey(0)

image, contours, hierarchy = cv2.findContours(mask, cv2.RETR_LIST, 
cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:

    if cv2.contourArea(contour) < 200:
        continue

    rect = cv2.minAreaRect(contour)
    box = cv2.boxPoints(rect)

    ext_left = tuple(contour[contour[:, :, 0].argmin()][0])
    ext_right = tuple(contour[contour[:, :, 0].argmax()][0])
    ext_top = tuple(contour[contour[:, :, 1].argmin()][0])
    ext_bot = tuple(contour[contour[:, :, 1].argmax()][0])

    roi_corners = np.array([box], dtype=np.int32)

    cv2.polylines(bounding_box_image, roi_corners, 1, (255, 0, 0), 3)
    cv2.imshow('image', bounding_box_image)
    cv2.waitKey(0)

    cropped_image = grayimage[ext_top[1]:ext_bot[1], ext_left[0]:ext_right[0]]
    cv2.imwrite('crop.jpg', cropped_image)

И вывод output image

0 голосов
/ 14 мая 2018
  1. Порог для двоичного значения @ 250
  2. Поиск контуров в двоичном виде
  3. Фильтрация контура по высоте / ширине boundingRect

enter image description here

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