1. 程式人生 > >從圖片中完整切除圓形物體 opencv+python

從圖片中完整切除圓形物體 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)  

切出來的效果還不錯,大概就是這樣吧
這裡寫圖片描述