Python 如何从周围环境中自动提取图像?

Python 如何从周围环境中自动提取图像?,python,opencv,image-processing,computer-vision,edge-detection,Python,Opencv,Image Processing,Computer Vision,Edge Detection,我有一张手机上的Instagram截图,我只想自动提取主图像,删除所有周围的内容和文字。我在考虑边缘检测或Hough变换,任何优雅而简单的解决方案 请考虑图像不一定总是居中,有时它只在下面的例子中部分显示。 谢谢 示例图像: 下面是一个使用OpenCV Python的简单方法 将图像转换为灰度 执行canny边缘检测 执行形态变换 查找轮廓并按最大轮廓面积排序 提取投资回报率 Canny边缘检测(左),然后对平滑图像执行形态学变换(右) 现在我们找到等高线并按最大等高线面积排序。这个

我有一张手机上的Instagram截图,我只想自动提取主图像,删除所有周围的内容和文字。我在考虑边缘检测或Hough变换,任何优雅而简单的解决方案

请考虑图像不一定总是居中,有时它只在下面的例子中部分显示。

谢谢

示例图像:


下面是一个使用OpenCV Python的简单方法

  • 将图像转换为灰度
  • 执行canny边缘检测
  • 执行形态变换
  • 查找轮廓并按最大轮廓面积排序
  • 提取投资回报率

Canny边缘检测(左),然后对平滑图像执行形态学变换(右)

现在我们找到等高线并按最大等高线面积排序。这个想法是,最大的轮廓将是主图像。即使图像没有居中,也应该是最大的区域。另外一个过滤步骤可以是添加以确保轮廓为正方形/矩形

cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]

for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    break

最后,为了提取ROI,我们可以使用

代码

cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]

for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    break
import cv2

image = cv2.imread('2.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 5, 150, 1)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
close = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel, iterations=2)

cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]

for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    break

cv2.imshow('canny', canny)
cv2.imshow('close', close)
cv2.imshow('image', image)
cv2.imshow('ROI', ROI)
cv2.imwrite('canny.png', canny)
cv2.imwrite('close.png', close)
cv2.imwrite('ROI.png', ROI)
cv2.imwrite('image.png', image)
cv2.waitKey(0)