zoukankan      html  css  js  c++  java
  • 5-7 灰度直方图均衡化

    总共256个灰度等级,每一个灰度等级它都会有一个概率,同时也都会有一个累计概率。

    比如说100这个灰度等级,它的累计概率是0.5,这个新的值我们就可以制作一个100到这个新值之间的映射。以后所有的灰度等级为100的像素我们直接就用255*0.5这个new,这个新的像素来替代。替代完之后那么整体这个过程就叫做直方图的均衡化。

    count的内容记录的是0-255总共256个灰度等级。每一个灰度等级出现的像素的个数然后除以总体像素的个数那么就是每一个灰度等级它们像素所占用的百分比,也就是它们概率。

    概率求出来之后我们计算累计概率。

    # 本质: 统计每个像素灰度 出现的概率 0-255 p
    # 累计概率
    # 1 0.2 0.2 第一个灰度等级它出现的概率是0.2
    # 2 0.3 0.5 第二个灰度等级它出现的概率是0.3
    # 3 0.1 0.6 第三个灰度等级它出现的概率是0.1
    # 256
    # 100 0.5 255*0.5 = new 
    
    
    
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv2.imread('image0.jpg',1)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    count = np.zeros(256,np.float)
    for i in range(0,height):
        for j in range(0,width):
            pixel = gray[i,j]
            index = int(pixel)
            count[index] = count[index]+1
    for i in range(0,255):
        count[i] = count[i]/(height*width)
    # 计算累计概率
    sum1 = float(0)
    for i in range(0,256):
        sum1 = sum1+count[i]
        count[i] = sum1
    print(count)
    
    cv2.waitKey(0)

    这就是每一个像素点它出现的概率,总共是0-255。

    可以看到最后的几个像素, 它的概率全都是1。因为累积到最后那么最后几个像素肯定必然是1。累积概率我们已经为大家交代清楚了,接下来需要根据这个累积概率来制作一个MAP的映射表。

    每个像素值的灰度我们把它映射成一个新的值。

    # 本质: 统计每个像素灰度 出现的概率 0-255 p
    # 累计概率
    # 1 0.2 0.2 第一个灰度等级它出现的概率是0.2
    # 2 0.3 0.5 第二个灰度等级它出现的概率是0.3
    # 3 0.1 0.6 第三个灰度等级它出现的概率是0.1
    # 256
    # 100 0.5 255*0.5 = new 
    
    
    
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv2.imread('image0.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    count = np.zeros(256,np.float)
    for i in range(0,height):
        for j in range(0,width):
            pixel = gray[i,j]
            index = int(pixel)
            count[index] = count[index]+1
    for i in range(0,255):
        count[i] = count[i]/(height*width)
    # 计算累计概率
    sum1 = float(0)
    for i in range(0,256):
        sum1 = sum1+count[i]
        count[i] = sum1
    #print(count)
    # 计算映射表
    map1 = np.zeros(256,np.uint16)
    for i in range(0,256):
        map1[i] = np.uint16(count[i]*255)
    # 映射
    for i in range(0,height):
        for j in range(0,width):
           pixel = gray[i,j]# 获取当前的像素值
           gray[i,j] = map1[pixel]
    cv2.imshow('dst',gray)
    cv2.waitKey(0)

    # 本质: 统计每个像素灰度 出现的概率 0-255 p
    # 累计概率
    # 1 0.2 0.2 第一个灰度等级它出现的概率是0.2
    # 2 0.3 0.5 第二个灰度等级它出现的概率是0.3
    # 3 0.1 0.6 第三个灰度等级它出现的概率是0.1
    # 256
    # 100 0.5 255*0.5 = new 
    
    
    
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv2.imread('image0.jpg',1)
    #cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('src',gray)
    count = np.zeros(256,np.float)
    for i in range(0,height):
        for j in range(0,width):
            pixel = gray[i,j]
            index = int(pixel)
            count[index] = count[index]+1
    for i in range(0,255):
        count[i] = count[i]/(height*width)
    # 计算累计概率
    sum1 = float(0)
    for i in range(0,256):
        sum1 = sum1+count[i]
        count[i] = sum1
    #print(count)
    # 计算映射表
    map1 = np.zeros(256,np.uint16)
    for i in range(0,256):
        map1[i] = np.uint16(count[i]*255)
    # 映射
    for i in range(0,height):
        for j in range(0,width):
           pixel = gray[i,j]# 获取当前的像素值
           gray[i,j] = map1[pixel]
    cv2.imshow('dst',gray)
    cv2.waitKey(0)

  • 相关阅读:
    QuickTest Professional对web网站进行测试后没有生成脚本信息解决办法
    如何使用loadrunner进行web网站性能测试
    spring boot架构浅谈
    spring cloud架构
    crontab误删操作的恢复与防范
    linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <
    redis原理及使用
    PHP三种字符串界定符的区别(单引号,双引号,<<<)
    php代码加密|PHP源码加密——实现方法
    java一键搭建新项目(地址)
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/9744585.html
Copyright © 2011-2022 走看看