在Jupyter Notebook上使用Python實現如下圖像的水平投影、垂直投影。關於opencv庫的安裝可以參考:Python下opencv庫的安裝過程與一些問題匯總。
1.實現代碼
import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image #讀取原圖片 image1=cv2.imread("project1.bmp") cv2.imshow("image1", image1) #灰度化處理 image0=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) cv2.imshow("image0", image0) #圖像二值化 ret,image2 = cv2.threshold(image0, 100, 255, cv2.THRESH_BINARY) cv2.imshow('image2', image2) #水平投影 (h1,w1)=image2.shape #返回高和寬 a = [0 for z in range(0, h1)] #初始化一個長度為w的數組,用於記錄每一行的黑點個數 #記錄每一行的波峰 for j in range(0,h1): for i in range(0,w1): if image2[j,i]==0: a[j]+=1 image2[j,i]=255 for j in range(0,h1): for i in range(0,a[j]): image2[j,i]=0 plt.imshow(image2,cmap=plt.gray())#灰度圖正確的表示方法 plt.show() cv2.imshow('image3',image2) # cv2.waitKey(0) # cv2.destroyAllWindows() #垂直投影 (h2,w2)=image2.shape #返回高和寬 b = [0 for z in range(0, w2)] #b = [0,0,0,0,0,0,0,0,0,0,...,0,0]初始化一個長度為w的數組,用於記錄每一列的黑點個數 #記錄每一列的波峰 for j in range(0,w2): #遍歷一列 for i in range(0,h2): #遍歷一行 if image2[i,j]==0: #如果該點為黑點 b[j]+=1 #該列的計數器加一,最后統計出每一列的黑點個數 image2[i,j]=255 #記錄完后將其變為白色 ,相當於擦去原圖黑色部分 for j in range(0,w2): for i in range((h2-b[j]),h2): #從該列應該變黑的最頂部的點開始向最底部塗黑 image2[i,j]=0 #塗黑 plt.imshow(image2,cmap=plt.gray()) plt.show() cv2.imshow('image4',image2) cv2.waitKey(0) cv2.destroyAllWindows()
以上過程,根據我自己的理解,以垂直投影為例,對於二值化后的灰度圖,計算其高和寬,初始化一個長度為寬的數組來記錄每一列包含的黑像素點個數,通過遍歷每一行每一列判斷每個點是否為黑點,如果為黑點則計數器加一,然后將該黑點變為白色,相當於擦去原圖的黑點,以便后面投影部分的顯現;統計完該列的所有黑點個數后,再繼續下一列,直到所有列的黑點個數被統計完畢。接下來就是投影部分,遍歷每一行每一列,從每一列應該塗黑的最頂部的點開始向最底部塗黑,塗黑的方法即將該點像素值置為黑,再通過灰度圖的正確表示方法顯示出來。
2.運行結果