【转】Python 边缘检测裁切图片

如何自动裁剪此图片中灰色的白色部分?


边缘检测裁剪图片中需要的部分
 

我想裁剪出灰色内部的白色部分,并将其另存为数千张图片的新图片。可以通过PIL或opencv完成吗?如果可以,怎么办?图片如下所示:

原图

 

我知道PIL库中有n个功能,但是如何使脚本自动在灰色中找到白色部分?白色部分有时在其中包含其他图像,有时甚至在其中包含文本。因此,在本示例中,白色部分并不总是空白的白色,也不是黑色的框架。

 

解决方案


这是主要思想:

  • 将图像转换为灰度并模糊图像
  • 执行Canny边缘检测
  • 查找图像轮廓并查找每个轮廓的区域
  • 过滤出最大轮廓区域并裁剪出ROI区域

卡尼边缘检测

 

现在,我们遍历每个轮廓并过滤出最大轮廓,该轮廓以绿色突出显示。

 

从边界框坐标裁剪ROI

 

import numpy as np
import cv2

original_image = cv2.imread("1.png")
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
canny = cv2.Canny(blurred, 120, 255, 1)

# Find contours in the image
cnts = cv2.findContours(canny.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Obtain area for each contour
contour_sizes = [(cv2.contourArea(contour), contour) for contour in cnts]

# Find maximum contour and crop for ROI section
if len(contour_sizes) > 0:
    largest_contour = max(contour_sizes, key=lambda x: x[0])[1]
    x,y,w,h = cv2.boundingRect(largest_contour)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original_image[y:y+h, x:x+w]
    cv2.imshow("ROI", ROI) 

cv2.imshow("canny", canny) 
cv2.imshow("detected", image) 
cv2.waitKey(0)

【感谢原作者】

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
边缘检测是数字图像处理中的一个重要步骤,它可以提取图像中的边缘信息,用于图像分割、目标检测等应用。Python中常用的边缘检测算法包括Sobel算子、Canny算子等。 下面以Sobel算子为例,介绍Python中如何进行图片边缘检测。 首先,导入必要的库: ```python import cv2 import numpy as np ``` 然后,读入图片并将其化为灰度图像: ```python img = cv2.imread('image.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 接下来,使用Sobel算子进行边缘检测: ```python sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) ``` 其中,sobelx和sobely分别表示x方向和y方向的边缘检测结果。 最后,将x方向和y方向的结果合并,得到最终的边缘检测结果: ```python sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) ``` 完整代码如下: ```python import cv2 import numpy as np img = cv2.imread('image.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) cv2.imshow('Sobel', sobel) cv2.waitKey(0) cv2.destroyAllWindows() ``` 运行代码后,会显示出边缘检测结果。 需要注意的是,Sobel算子只能检测出灰度图像中的边缘,如果需要在彩色图像中进行边缘检测,需要先将其化为灰度图像。同时,Sobel算子还需要指定ksize参数,表示卷积核的大小,一般取3或5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值