如何使用OpenCV从屏幕截图中裁剪图像?

时间:2018-12-27 09:23:02

标签: python opencv image-processing edge-detection opencv-contour

我最近开始研究图像处理,并完成了一项任务,需要使用OpenCV从移动Instagram屏幕截图中裁剪图像。我需要找到轮廓和裁切的图像边缘,但是我不确定如何正确执行此操作。

我尝试查找如下示例:

How to crop biggest rectangle out of an image

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

How to detect edge and crop an image in Python

How to crop rectangular shapes in an image using Python

但是我仍然不知道该怎么做。

基本上我有这样的图像:

https://imgur.com/a/VbwCdkOhttps://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 :(得分:1)

快照图像的显着特征之一是白色背景色。一切都显示在其顶部,即使是该用户图像也是如此。因此,我们将尝试分割出背景,从而使我们剩下一些较小的组件,例如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