OPENCV Как заполнить недостающий прямоугольник?

1

Мой вопрос слишком прост. У меня такой прямоугольник. Я хочу заполнить недостающие части этой площади. Также мне нужны координаты отсутствующих частей. Как я могу это сделать? Прямоугольник

Я должен походить на второе изображение после процесса. Второе изображение

  • 0
    Вы пытались сгенерировать какой-либо код для этого?
  • 0
    Сожалею. Я понятия не имею, как это сделать.
Показать ещё 2 комментария
Теги:
opencv

1 ответ

2
Лучший ответ

Вот краткое изложение этого подхода:

  1. Сканирование по горизонтали по строке
  2. Сканировать вертикально col на col
  3. Подготовьте список потенциальных точек
  4. Группировка очков по расстоянию
  5. Найдите ограничительную рамку вокруг подгруппированных точек
  6. Вычислите прямоугольники и игнорируйте те, которые касаются границ изображения.

Исходный код:

Прежде всего, импортируйте необходимые библиотеки.

import numpy as np
import cv2

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

def too_easy_distance(pt1, pt2, is_print=False):
    if is_print: print ("too easy!")
    return ((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2) ** 0.5

В-третьих, загрузите изображение и узнайте ширину и высоту.

img = cv2.imread("broken_rect.png", 0)
height, width = img.shape[:2]
active_threshold = 25   # adjust this parameter based on the thickness of borders
potential_pts = []

Теперь сканирование изображения по горизонтали по строкам.

for i in range(height):
    if len (np.where(img[i:i+1,:]==0)[1] ) < active_threshold:
        continue
    is_start = False
    is_real_start = False
    for j in range(width):
        if img[i,j] == 0 and is_start is False:
            is_start = True
            continue
        # Enter the valid region
        if is_start and is_real_start is False:
            if img[i,j] == 255:
                is_real_start = True
            else:
                is_real_start = False

        if is_real_start:
            if img[i,j] == 255:
                potential_pts.append((j, i)) 
            else:
                is_real_start = False

Затем сканируйте изображение по вертикали по столбцу.

for j in range(width):
    if len (np.where(img[:, j:j+1]==0)[1] ) < active_threshold:
        continue
    is_start = False
    is_real_start = False
    for i in range(height):
        if img[i,j] == 0 and is_start is False:
            is_start = True
            continue
        # Enter the valid region
        if is_start and is_real_start is False:
            if img[i,j] == 255:
                is_real_start = True
            else:
                is_real_start = False

        if is_real_start:
            if img[i,j] == 255:
                potential_pts.append((j, i))
            else:
                is_real_start = False

Наконец, отсортируйте список и покажите результат.

grouped_pts = []  #list of list
for pt in potential_pts:
    if len(grouped_pts) == 0:
        grouped_pts.append([pt])  # create a new sublist and add pt to the new sublist
    # enter the grouped_pts loop
    is_found_place = False
    for sublist in grouped_pts:
        for prev_pt in sublist:
            if too_easy_distance(pt, prev_pt) < 2:
                sublist.append(pt) # add to the list
                is_found_place = True
                break
    # if nothing happend
    if is_found_place is False:
        grouped_pts.append([pt]) # create a new sublist and add pt to the new sublist

result_image = cv2.cvtColor(img.copy(), cv2.COLOR_GRAY2RGB)

for sublist in grouped_pts:
    x,y,w,h = cv2.boundingRect(np.array(sublist))
    if x == 0 or y == 0 or x+w == width or y+h == height:
        continue

    rect = ((x, y), (x+w-1, y+h-1))
    cv2.rectangle(result_image, rect[0], rect[1], (0,255,0), -1)
    print ("Rect Found! [Top-Left]: " + str(rect[0]) + " [Bottom-Right]: " + str([rect[1]]) )

cv2.imshow("result_image", result_image)
cv2.waitKey()

Результат изображения: Изображение 174551

Выход терминала:

Rect Found! [Top-Left]: (267, 62) [Bottom-Right]: [(313, 69)]
Rect Found! [Top-Left]: (552, 327) [Bottom-Right]: [(559, 364)]
  • 1
    Не просто опубликовать вывод. Объясните подход, чтобы он мог учиться и знать, как это делается.
  • 0
    Извините, неправильно нажал кнопку «Опубликовать». Я отредактирую свой ответ.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню