2018-03-0418:03:12
整體代碼如下:
def detect_circle_demo (image): # 降噪處理 dst = cv.pyrMeanShiftFiltering(image,10,80) cv.imshow("jiangzao",dst) cimage = cv.cvtColor(dst,cv.COLOR_BGR2GRAY) # 灰度圖轉換 print("正在灰度轉換。。。。。。") cv.imshow("test",cimage) # 霍夫圓處理 circles = cv.HoughCircles(cimage,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) print("原值",circles) # 轉換為整數 circles = np.uint16(np.around(circles)) print("轉換為整數",circles) for i in circles[0,:]: cv.circle(image,(i[0],i[1]),i[2],(0,0,255),2) cv.circle(image,(i[0],i[1]),2,(255,0,0),2) cv.imshow("circle",image) src = cv.imread("E:/opencv_pictures/smarties.png") cv.namedWindow("output",cv.WINDOW_AUTOSIZE) cv.imshow("output",src) detect_circle_demo(src) cv.waitKey(0) cv.destroyAllWindows()
Meanshift的代碼:
cv.pyrMeanShiftFiltering(image,10,80)
因為主要目的是預處理降噪,windows size和color distance都不用太大,避免浪費計算時間還有過度降噪。降噪后可以看到桌面上的紋理都被抹去了,紙張邊緣附近干凈了很多。然而這還遠遠不夠,圖案本身,和圖像里的其他物體都有很多明顯的邊緣,而且都是直線邊緣。
降噪處理,一般是為了避免,處理邊緣時的模糊問題,這樣能更精確的發現邊緣。
其中,沒有檢測到圓的問題如下圖:
右上角出現未檢測到的圓,應該是降噪過度導致的,所以修改參數即可。
如圖,即可識別所有的原型,如果出現亂線,就是滿屏的紅線,那就是未降噪,或者是降噪不足導致的。