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

     

     

     

     

     

     

     

  • 相关阅读:
    PHP静态
    PHP批量删除
    PHP增删改查
    PHP数据访问
    PHP继承和多态
    PHP封装
    PHP字符串处理和正则表达式
    PHP数组
    PHP函数
    PHP基础
  • 原文地址:https://www.cnblogs.com/BIXIABUMO/p/12734889.html
Copyright © 2020-2023  润新知