Сегодня я хочу показать вам сладкий алгоритм, с которым вы можете удалить объекты с картинки. Например, если у нас есть тысячи изображений, где у нас есть некоторые объекты, которые мы хотим удалить, этот алгоритм может помочь нам выполнить эту задачу.
Мы будем использовать модифицированные Шаблон Сопоставление подход. Мы загрузим шаблон, преобразуемся в серого, выполним обнаружение хитрых краев, после этого мы загружаем исходное изображение, конвертируем в серогоском Непрерывно восстанавливает изображение, применяйте шаблоны, сопоставляя с использованием краев и отслеживайте Найдите координаты наиболее подходящей ограничивающей коробки, а затем стирайте нежелательную рентабельность инвестиций Мы будем использовать модуль CV2 и Numpy. Вы можете прочитать о них на этих URL.
Мы будем использовать CV2
модуль и Numpy
Анкет Вы можете прочитать о них на этих URL -адресах, CV2 и Numpy Анкет
Давайте сначала начнем кодировать, мы импортируем модуль
import cv2 import numpy as np
После этого мы изменили размер изображения и поддерживаем соотношение сторон
def maintain_aspect_ratio_resize(image, width=None, height=None, inter=cv2.INTER_AREA):
Затем мы получаем размер изображения и инициализируем размеры
dim = None (h, w) = image.shape[:2]
Затем мы возвращаем исходное изображение, если не нужно изменять размер:
if width is None and height is None: return image
Мы изменяем размер высоты, если ширина нет
if width is None: r = height / float(h) dim = (int(w * r), height)
Мы изменяем размеры ширины, если высота нет
else: r = width / float(w) dim = (width, int(h * r))
Вернуть измененное изображение
return cv2.resize(image, dim, interpolation=inter)
Шаблон нагрузки, преобразуйте в серого, выполните обнаружение хитрых краев
template = cv2.imread('template.png') template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) template = cv2.Canny(template, 50, 200) (tH, tW) = template.shape[:2] cv2.imshow("template", template)
Загрузить исходное изображение, преобразовать в серогой
original_image = cv2.imread('test.png') final = original_image.copy() gray = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) found = None
Динамическое изменение размера изображения для лучшего соответствия шаблонов
for scale in np.linspace(0.2, 1.0, 20)[::-1]: resized = maintain_aspect_ratio_resize(gray, width=int(gray.shape[1] * scale)) r = gray.shape[1] / float(resized.shape[1]) if resized.shape[0] < tH or resized.shape[1] < tW: break canny = cv2.Canny(resized, 50, 200) detected = cv2.matchTemplate(canny, template, cv2.TM_CCOEFF) (_, max_val, _, max_loc) = cv2.minMaxLoc(detected) if found is None or max_val > found[0]: found = (max_val, max_loc, r)
Вычислить координаты ограничивающей коробки
(_, max_loc, r) = found (start_x, start_y) = (int(max_loc[0] * r), int(max_loc[1] * r)) (end_x, end_y) = (int((max_loc[0] + tW) * r), int((max_loc[1] + tH) * r))
Нарисуйте ограничивающую коробку на ROI, чтобы удалить
cv2.rectangle(original_image, (start_x, start_y), (end_x, end_y), (0,255,0), 2) cv2.imshow('detected', original_image)
Стереть нежелательную рентабельность инвестиций (заполнить рентабельность рентабельности белым
cv2.rectangle(final, (start_x, start_y), (end_x, end_y), (255,255,255), -1) cv2.imwrite('final.png', final) cv2.waitKey(0)
Исходное изображение:
Когда мы запускаем сценарий, мы получаем этот результат
Весь код:
import cv2 import numpy as np def maintain_aspect_ratio_resize(image, width=None, height=None, inter=cv2.INTER_AREA): dim = None (h, w) = image.shape[:2] if width is None and height is None: return image if width is None: r = height / float(h) dim = (int(w * r), height) else: r = width / float(w) dim = (width, int(h * r)) return cv2.resize(image, dim, interpolation=inter) template = cv2.imread('template.png') template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) template = cv2.Canny(template, 50, 200) (tH, tW) = template.shape[:2] cv2.imshow("template", template) original_image = cv2.imread('test.png') final = original_image.copy() gray = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) found = None for scale in np.linspace(0.2, 1.0, 20)[::-1]: resized = maintain_aspect_ratio_resize(gray, width=int(gray.shape[1] * scale)) r = gray.shape[1] / float(resized.shape[1]) if resized.shape[0] < tH or resized.shape[1] < tW: break canny = cv2.Canny(resized, 50, 200) detected = cv2.matchTemplate(canny, template, cv2.TM_CCOEFF) (_, max_val, _, max_loc) = cv2.minMaxLoc(detected) if found is None or max_val > found[0]: found = (max_val, max_loc, r) (_, max_loc, r) = found (start_x, start_y) = (int(max_loc[0] * r), int(max_loc[1] * r)) (end_x, end_y) = (int((max_loc[0] + tW) * r), int((max_loc[1] + tH) * r)) cv2.rectangle(original_image, (start_x, start_y), (end_x, end_y), (0,255,0), 2) cv2.imshow('detected', original_image) cv2.rectangle(final, (start_x, start_y), (end_x, end_y), (255,255,255), -1) cv2.imwrite('final.png', final) cv2.waitKey(0)
Спасибо вам всем
Оригинал: “https://dev.to/stokry/how-to-remove-an-object-from-an-image-with-python-2md9”