Рубрики
Без рубрики

Как удалить объект с изображения с питоном

Сегодня я хочу показать вам сладкий алгоритм, с которым вы можете удалить объекты с картинки. Для бывшего … Tagged с Python, производительность, Showdev, Tuperial.

Сегодня я хочу показать вам сладкий алгоритм, с которым вы можете удалить объекты с картинки. Например, если у нас есть тысячи изображений, где у нас есть некоторые объекты, которые мы хотим удалить, этот алгоритм может помочь нам выполнить эту задачу.

Мы будем использовать модифицированные Шаблон Сопоставление подход. Мы загрузим шаблон, преобразуемся в серого, выполним обнаружение хитрых краев, после этого мы загружаем исходное изображение, конвертируем в серогоском Непрерывно восстанавливает изображение, применяйте шаблоны, сопоставляя с использованием краев и отслеживайте Найдите координаты наиболее подходящей ограничивающей коробки, а затем стирайте нежелательную рентабельность инвестиций Мы будем использовать модуль 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”