利用opencvpython实现下图的水平和垂直方向投影
图123.jpg
先看一下运行结果
水平投影
垂直投影
图project1.bmp
水平投影
垂直投影
代码如下
这个代码实现的是project1.bmp的投影
import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
img=cv2.imread('E:\\project1.bmp')
#将图像转为灰度图
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#水平投影
ret,thresh1=cv2.threshold(GrayImage,130,255,cv2.THRESH_BINARY)
(h,w)=thresh1.shape #返回高和宽
#初始化一个跟图像高一样长度的数组,用于记录每一行的黑点个数
a = [0 for z in range(0, h)]
for j in range(0,h): #遍历每一行
for i in range(0,w): #遍历每一列
if thresh1[j,i]==0: #判断该点是否为黑点,0代表黑点
a[j]+=1 #该行的计数器加一
thresh1[j,i]=255#将其改为白点,即等于255
for j in range(0,h): #遍历每一行
for i in range(0,a[j]): #从该行应该变黑的最左边的点开始向最右边的点设置黑点
thresh1[j,i]=0 #设置黑点
plt.imshow(thresh1,cmap=plt.gray())
plt.show()
#垂直投影
ret,thresh1=cv2.threshold(GrayImage,130,255,cv2.THRESH_BINARY)
(h,w)=thresh1.shape #返回高和宽
#初始化一个跟图像宽一样长度的数组,用于记录每一列的黑点个数
a = [0 for z in range(0, w)]
for j in range(0,w): #遍历每一列
for i in range(0,h): #遍历每一行
if thresh1[i,j]==0: #判断该点是否为黑点,0代表是黑点
a[j]+=1 #该列的计数器加1
thresh1[i,j]=255#记录完后将其变为白色,即等于255
for j in range(0,w): #遍历每一列
for i in range(h-a[j],h):#从该列应该变黑的最顶部的开始向最底部设为黑点
#for i in range(0,a[i]):
thresh1[i,j]=0 #设为黑点
plt.imshow(thresh1,cmap=plt.gray())
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()