Python + openCV 實現圖像垂直投影和水平投影
1. 先將需要投影的圖片轉為灰度圖,我寫了兩個函數,分別實現對圖像進行垂直投影和水平投影;
if __name__ == '__main__': img = cv2.imread('C:\\Users\\24493\\Desktop\\123.jpg') cv2.imshow("image",img) GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #將img圖像轉換為灰度圖,輸出為GrayImage getVProjection(GrayImage) #調用getVProjection函數進行垂直投影 getHProjection(GrayImage) #調用getHProjection函數進行水平投影 cv2.waitKey(0) cv2.destroyAllWindows()
2. 進行垂直投影,將傳入的灰度圖轉為黑白二值圖,統計出每列的黑色點,然后再將統計結果全部集中在底部顯示
def getVProjection(image): # 將image圖像轉為黑白二值圖,ret接收當前的閾值,thresh1接收輸出的二值圖 ret, thresh1 = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) (h,w)=thresh1.shape #返回高和寬 a = [0 for z in range(0, w)] #a = [0,0,0,...,0,0]初始化一個長度為w的數組,用於記錄每一列的黑點個數 #記錄每一列的波峰 for j in range(0,w): #遍歷一列 for i in range(0,h): #遍歷一行 if thresh1[i,j]==0: #如果該點為黑點 a[j]+=1 #該列的計數器加一計數 thresh1[i,j]=255 #記錄完后將其變為白色 for j in range(0,w): #遍歷每一列 for i in range((h-a[j]),h): #從該列應該變黑的最頂部的點開始向最底部塗黑 thresh1[i,j]=0 #塗黑 cv2.imshow('Vimage',thresh1)
3. 進行水平投影,將傳入的灰度圖轉為黑白二值圖,統計出每行的黑色點,然后再將統計結果全部集中在左邊顯示;
def getHProjection(image): # 將image圖像轉為黑白二值圖,ret接收當前的閾值,thresh1接收輸出的二值圖 ret, thresh1 = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) (h,w)=thresh1.shape #返回高和寬 a = [0 for z in range(0, h)] #a = [0,0,0,...,0,0]初始化一個長度為h的數組,用於記錄每一行的黑點個數 #記錄每一行的波峰 for j in range(0,h): #遍歷一行 for i in range(0,w): #遍歷一列 if thresh1[j,i]==0: #如果該點為黑點 a[j]+=1 #該列的計數器加一計數 thresh1[j,i]=255 #記錄完后將其變為白色 for j in range(0,h): #遍歷每一行 for i in range(a[j]): #從該行頂部的點開始向右塗黑統計的黑點數 thresh1[j,i]=0 #塗黑 cv2.imshow('Himage',thresh1)
以下圖為例:
原圖:
垂直投影為:
水平投影為: