Как обрезать изображение со скриншота с использованием OpenCV? - PullRequest
0 голосов
/ 27 декабря 2018

Я недавно начал изучать обработку изображений и взял задачу, где мне нужно обрезать изображение с мобильного скриншота Instagram с помощью OpenCV.Мне нужно найти края изображения с контурами и кадрированием, но я не уверен, как это сделать правильно.

Я попытался найти некоторые примеры, подобные этим:

Как обрезать самый большой прямоугольник из изображения

https://www.quora.com/How-can-I-detect-an-object-from-static-image-and-crop-it-from-the-image-using-openCV

Как определить края и обрезать изображение в Python

Как обрезать прямоугольные формы на изображении с помощью Python

Но я все еще не понимаю, как это сделать в моем случае.

В основном у меня есть изображениявот так:

https://imgur.com/a/VbwCdkO и https://imgur.com/a/Mm69i35

И результат должен быть таким:

https://imgur.com/a/Bq6Zjw0

https://imgur.com/a/AhzOkWS

Используемые снимки экрана должны быть только из мобильной версии Instagram, и можно предположить, что они всегда имеют прямоугольную форму

И если имеется более одного изображения, как здесь:

https://imgur.com/a/avv8Wvv

Затем обрезается только один из двух (который не имеет значения).Например:

https://imgur.com/a/a4KnRKC

Спасибо!

1 Ответ

0 голосов
/ 27 декабря 2018

Одной из заметных особенностей ваших снимков является белый цвет фона.Все появляется поверх этого, даже это изображение пользователя.Поэтому мы попытаемся сегментировать фон, который оставит нас с меньшими компонентами, такими как значок Instagram, лайки и т. Д. Затем мы выберем самый большой элемент, предполагая, что изображение пользователя является самым большим элементом, присутствующим на экране.Затем мы просто найдем cv2.boundingRect() наибольшего контура и обрежем снимок соответственно:

import cv2
import numpy as np

img = cv2.imread("/path/to/img.jpg")

white_lower = np.asarray([230, 230, 230])
white_upper = np.asarray([255, 255, 255])

mask = cv2.inRange(img, white_lower, white_upper)
mask = cv2.bitwise_not(mask)

enter image description here

Теперь заполним контуры поиска вэту маску и выберите самую большую.

im, cnt, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
largest_contour = max(cnt, key=lambda x:cv2.contourArea(x))
bounding_rect = cv2.boundingRect(largest_contour)

cropped_image = img[bounding_rect[1]: bounding_rect[1]+bounding_rect[3],
                bounding_rect[0]:bounding_rect[0]+bounding_rect[2]]

enter image description here

...