zoukankan      html  css  js  c++  java
  • 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.运行结果

     

     

     

     

     

     

     

  • 相关阅读:
    宿主机( win 7 系统) ping 虚拟机VMware( cent os 6.6 ) 出现“请求超时”或者“无法访问目标主机”的解决方法
    Java实现 LeetCode 23 合并K个排序链表
    Java实现 LeetCode 23 合并K个排序链表
    Java实现 LeetCode 23 合并K个排序链表
    Java实现 LeetCode 22 括号生成
    Java实现 LeetCode 22 括号生成
    Java实现 LeetCode 22 括号生成
    Java实现 LeetCode 21 合并两个有序链表
    Java实现 LeetCode 21 合并两个有序链表
    Java实现 LeetCode 21 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/BIXIABUMO/p/12734889.html
Copyright © 2011-2022 走看看