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