opencv 檢測圖片中圓形物體(解決亂線問題)


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都不用太大,避免浪費計算時間還有過度降噪。降噪后可以看到桌面上的紋理都被抹去了,紙張邊緣附近干凈了很多。然而這還遠遠不夠,圖案本身,和圖像里的其他物體都有很多明顯的邊緣,而且都是直線邊緣。

降噪處理,一般是為了避免,處理邊緣時的模糊問題,這樣能更精確的發現邊緣。

其中,沒有檢測到圓的問題如下圖:

右上角出現未檢測到的圓,應該是降噪過度導致的,所以修改參數即可。

如圖,即可識別所有的原型,如果出現亂線,就是滿屏的紅線,那就是未降噪,或者是降噪不足導致的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM