最近對水平和垂直投影圖做了曲線擬合,具體步驟是將原圖輸入然後進行灰度化,直方圖均衡化,二值化以後對像素進行按行相加或者按列相加,得到一維數組,再將得到的數組下標以及數組裏的數值作爲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)
原圖:
垂直和水平投影圖圖示:
垂直投影圖曲線擬合:
水平投影圖曲線擬合: