Мой вопрос слишком прост. У меня такой прямоугольник. Я хочу заполнить недостающие части этой площади. Также мне нужны координаты отсутствующих частей. Как я могу это сделать? Прямоугольник
Я должен походить на второе изображение после процесса. Второе изображение
Вот краткое изложение этого подхода:
Исходный код:
Прежде всего, импортируйте необходимые библиотеки.
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()
Результат изображения:
Выход терминала:
Rect Found! [Top-Left]: (267, 62) [Bottom-Right]: [(313, 69)]
Rect Found! [Top-Left]: (552, 327) [Bottom-Right]: [(559, 364)]