从图片中完整切除圆形物体 opencv+python

面临一个任务就是要图片中的圆形物体切出来,然后做异常点检测(就是看那些圆形物体是异常点),因为异常点检测的方法还在摸索,现在就先把从图片中把圆形物体完整切出的方法写出来。

1.首先图片是这样的(圆形物体非常多)
这里写图片描述

2.接下来就是代码部分:

import os
import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

img_path = 'D:\\\\ProgramData\\\\007.png'
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('original_img', img)
# cv2.imshow('gray', gray)
# cv2.waitKey()

#对模糊图像二值化。梯度图像中不大于90的任何像素都设置为0(黑色)。 否则,像素设置为255(白色)
(_, thresh) = cv2.threshold(gray, 53, 255, cv2.THRESH_BINARY_INV)
# cv2.imshow('thresh', thresh)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel,None,(-1,-1),1)
# cv2.imshow('closed', closed)
# cv2.waitKey(0)#无限期等待输入

(_, cnts, _) = cv2.findContours(closed,cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# draw a bounding box arounded the detected barcode and display the image
img_copy = img.copy()
cv2.drawContours(img_copy, cnts, -1, (0, 255, 0), 1)

以上的工作主要就是打开图片,对图片进行灰度处理,阈值处理,查找边缘,最后画出边缘,经过这一步处理后,大致图片大致是这样的
这里写图片描述

效果一般,具体图片效果要根据调节阈值化参数来达到

centers = []
for i in range(0,len(cnts)): 
    (rx,ry),radius = cv2.minEnclosingCircle(cnts[i]) ##找出这些曲线点坐标的最小封闭圆的圆心和半径
    center = (int(rx),int(ry))
    centers.append(center)
    radius = int(radius)
    cv2.circle(img,center,28,(255,0,0),2)

这一步是根据上面代码中获取到圆形物体的边缘坐标,用圆形曲线去做拟合,得出每个圆的半径和圆心坐标。经过这一步处理之后,效果大概是这样:
这里写图片描述

最后根据这些圆心坐标和半径把图片中的圆形物体切出来

r = 28
for i in range(0,len(centers)):    
#     img_test = cv2.circle(img,centers[i],28,(255,0,0),2)
    x = centers[i][0]
    y = centers[i][1]
    rectX = (x - r) 
    rectY = (y - r)
    if(rectX < 0):
        rectX = 0    
    crop_img = img[rectY:(y+r),rectX:(x+r)]  #Y在前,X在后,用矩阵来裁剪圆形区域
    cv2.imwrite('D:\\\\ProgramData\\\\cut\\\\'+str(x)+'_'+str(y)+'.png',crop_img)  

切出来的效果还不错,大概就是这样吧
这里写图片描述


  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥宅程序员aka不会游泳的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值