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)
以下图为例:
原图: