Python+OpenCV实现图像水平投影、垂直投影

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

 

 

 

 

 

 

 

 

 

posted @ 2020-04-19 23:01  圈er  阅读(2375)  评论(0编辑  收藏  举报