Python+OpenCV實現圖像水平投影、垂直投影


 在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.運行結果

 

 

 

 

 

 

 

 

 


免責聲明!

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



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