python+opencv圖像投影、水平投影、垂直投影


python+opencv圖像投影

一、圖像投影

水平投影:以y軸為軸投影

垂直投影:以x軸為軸投影

原圖:

二、水平投影

代碼及解釋:

 1 #水平投影
 2 import numpy as np
 3 import cv2 as cv 
 4 img=cv.imread("123.jpg",0)
 5 ret,img1=cv.threshold(img,80,255,cv.THRESH_BINARY)
 6 
 7 #返回圖像的高和寬
 8 (h,w)=img1.shape
 9 
10 #初始化一個跟圖像高一樣長度的數組,用於記錄每一行的黑點個數
11 a=[0 for z in range(0,h)]
12 
13 for i in range(0,h):          #遍歷每一行
14     for j in range(0,w):      #遍歷每一列
15         if img1[i,j]==0:      #判斷該點是否為黑點,0代表黑點
16             a[i]+=1           #該行的計數器加一
17             img1[i,j]=255     #將其改為白點,即等於255
18 for i in range(0,h):          #遍歷每一行
19     for j in range(0,a[i]):   #從該行應該變黑的最左邊的點開始向最右邊的點設置黑點
20         img1[i,j]=0           #設置黑點
21 cv.imshow("img",img1) 
22 cv.waitKey(0) 
23 cv.destroyAllWindows() 

效果圖:

三、垂直投影

代碼及解釋:

 1 #垂直投影
 2 import numpy as np
 3 import cv2 as cv 
 4 img=cv.imread("123.jpg",0)
 5 ret,img1=cv.threshold(img,80,255,cv.THRESH_BINARY)
 6 
 7 #返回圖像的高和寬
 8 (h,w)=img1.shape
 9 
10 #初始化一個跟圖像寬一樣長度的數組,用於記錄每一列的黑點個數
11 a =[0 for z in range(0,w)]
12 
13 for i in range(0,w):           #遍歷每一列  
14     for j in range(0,h):       #遍歷每一行
15         if img2[j,i]==0:       #判斷該點是否為黑點,0代表是黑點
16             a[i]+=1            #該列的計數器加1
17             img2[j,i]=255      #記錄完后將其變為白色,即等於255
18 for i in range(0,w):           #遍歷每一列
19     for j in range(h-a[i],h):  #從該列應該變黑的最頂部的開始向最底部設為黑點
20         img2[j,i]=0            #設為黑點
21 cv.imshow("img",img2) 
22 cv.waitKey(0) 
23 cv.destroyAllWindows()

效果圖:

四、經驗分享

(1)直接調用圖像的寬會報錯

解決方法:給圖像的高和寬一個返回值,調用返回值

(2)二值化處理使用cv.THRESH_BINARY_INV函數,會導致實際效果圖與理想效果圖不一致。

解決方法;將二值化處理的函數改為cv.THRESH_BINARY

 


免責聲明!

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



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