我最近开始研究图像处理,并完成了一项任务,需要使用OpenCV从移动Instagram屏幕截图中裁剪图像。我需要找到轮廓和裁切的图像边缘,但是我不确定如何正确执行此操作。
我尝试查找如下示例:
How to crop biggest rectangle out of an image
How to detect edge and crop an image in Python
How to crop rectangular shapes in an image using Python
但是我仍然不知道该怎么做。
基本上我有这样的图像:
https://imgur.com/a/VbwCdkO 和 https://imgur.com/a/Mm69i35
结果应该是这样的:
使用的屏幕截图仅应来自Instagram的移动版本,并且可以假定它们始终为矩形
如果有不止一个像这样的图像:
然后仅裁剪两个中的一个(无关紧要)。 例如:
谢谢!
答案 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)
现在,我们在此蒙版中填充找到的轮廓,然后选择最大的轮廓。
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]]