在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.运行结果