從圖片中完整切除圓形物體 opencv+python
阿新 • • 發佈:2018-11-12
面臨一個任務就是要圖片中的圓形物體切出來,然後做異常點檢測(就是看那些圓形物體是異常點),因為異常點檢測的方法還在摸索,現在就先把從圖片中把圓形物體完整切出的方法寫出來。
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)
切出來的效果還不錯,大概就是這樣吧