python-對水平和垂直投影圖做曲線擬合

最近對水平和垂直投影圖做了曲線擬合,具體步驟是將原圖輸入然後進行灰度化,直方圖均衡化,二值化以後對像素進行按行相加或者按列相加,得到一維數組,再將得到的數組下標以及數組裏的數值作爲x,y座標進行多項式擬合。

對於水平投影圖的曲線擬合:

def lineation1(img1):
    GrayImage=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)   #將BGR圖轉爲灰度圖
    imgEqualizeHist = cv2.equalizeHist(GrayImage)#直方圖均衡化
    ret,gray_img=cv2.threshold(imgEqualizeHist,130,255,cv2.THRESH_BINARY)
  
#黑白顛倒
    gray_img = cv2.bitwise_not(gray_img)
    
    y = np.sum(gray_img, axis=1)
    #當axis爲0,是壓縮行,即將每一列的元素相加,將矩陣壓縮爲一行
#當axis爲1,是壓縮列,即將每一行的元素相加,將矩陣壓縮爲一列(這裏的一列是爲了方便理解說的,實際上,在控制檯的輸出中,仍然是以一行的形式輸出的)
#用3次多項式擬合 a
    x=[i for i in range(len(y))]
        
    f1 = np.polyfit(x, y, 20)
    print('f1 is :\n',f1)
 
    p1 = np.poly1d(f1) # p1爲多項式,f1爲擬合。
    print('p1 is :\n',p1)
 
#也可使用yvals=np.polyval(f1, x)
    yvals = p1(x)  #擬合y值
    print('yvals is :\n',yvals)
#繪圖
    plot1 = plt.plot(x, y, 's',label='original values')
    plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend(loc=4) #指定legend的位置右下角
    plt.title('shuiping')
    plt.show()

對於垂直投影圖的曲線擬合只和水平有一句代碼不同:

y = np.sum(gray_img, axis=0)

原圖:
在這裏插入圖片描述垂直和水平投影圖圖示:
在這裏插入圖片描述
垂直投影圖曲線擬合:
在這裏插入圖片描述
水平投影圖曲線擬合:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章