Python OpenCV实例:图像直方图均衡化(数学公式简单实现)

Stella981
• 阅读 594
#coding:utf-8
'''
直方图均衡化
作用:通常用来增加图像局部对比度,尤其在图像的有用数据的对比度相当
      接近时,通过直方图均衡化,图像的亮度可以更好地在直方图上分布
基本思想:把原始图像的直方图变换为均匀分布的形式,增加了像素
        灰度值的动态范围,从而增强图像的整体对比度效果

算法实现步骤:
1、计算图像f的各个灰度级中像素出现的概率
  p(i) = n(i) / n ,{i|0,1,...,L - 1}
  其中:n(i)表示灰度级i出现的次数,L是图像中所有的灰度数,p实际上是图像的
        直方图归一化到0~1范围内,如果把c作为对应p的累计概率函数,则定义为:
               i
        c(i) = ∑(p(x(j))
               j=0
        c是图像的累计归一化直方图

2、创建一个形式为 y = T(x)的变化,原始图像中的每个值就生产一个y,这样
    y的累计概率函数形式就可以在所有值范围内进行线性化,转换公式为:
    y(i) = T(x(i)) = c(i)
'''

import cv2
import numpy as np

def hist_eq(image):
    img_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
    rows,cols = img_gray.shape
    gray_flat = img_gray.reshape((rows*cols,))
    dist_flat = np.zeros_like(gray_flat)

    count_pixel = np.zeros((256,),np.int32)
    temp = np.zeros((256,),np.int32)
    pixmap = np.zeros((256,),np.uint8)
    image_bytes = cols * rows
    # 计算各个灰度级数量
    for index,value in enumerate(gray_flat):
        count_pixel[value] += 1

    # 计算灰度级的累计分布
    for i in range(256):
        if i == 0:
            temp[0] = count_pixel[0]
        else:
            temp[i] = temp[i - 1] + count_pixel[i]

        # 计算累计概率函数,并把值扩展到0~255
        value = 255.0 * (temp[i] / image_bytes)
        if value > 255:
            value = 255
        if value < 0:
            value = 0
        pixmap[i] = value

    # 灰度等级映射转换
    for i in range(image_bytes):
        dist_flat[i] = pixmap[gray_flat[i]]

    dist = dist_flat.reshape((rows,cols))

    return dist

src = cv2.imread('datas/l1.jpg')
gray = cv2.cvtColor(src,cv2.COLOR_RGB2GRAY)

dist = hist_eq(src)

# 调用OpenCV函数
dist_cv = np.zeros_like(gray)
cv2.equalizeHist(gray,dist_cv)

cv2.imshow('src',gray)
cv2.imshow('dist',dist)
cv2.imshow('opencv-histeq',dist_cv)
cv2.waitKey()
cv2.destroyAllWindows()

Python OpenCV实例:图像直方图均衡化(数学公式简单实现)

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
OpenCV-Python图像转换为PyQt图像的变形及花屏无法正常显示问题研究
☞░ 前往老猿Python博文目录 ░一、引言在《PyQt转换显示PythonOpenCV图像实现图形化界面的视频播放》介绍了实现在OpenCV和PyQt之间转换并传递图像实现在PyQt上播放视频图像的功能。其中的关键函数如下:defcvImgtoQtImg(cvImg):定义opencv图像转PyQt图像的函数QtImgBufcv2.
Karen110 Karen110
3年前
Python-OpenCV获取图像轮廓的图像处理方法
一、引言在《OpenCV阈值处理函数threshold处理32位彩色图像的案例》介绍了threshold函数,但threshold的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法并不能得到好的效果。图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想的分割效果。在图片中的灰度是不均匀的,所以通常情
Stella981 Stella981
3年前
Python OpenCV实例:图像灰度拉伸
coding:utf8'''灰度拉伸定义:灰度拉伸,也称对比度拉伸,是一种简单的线性点运算。作用:扩展图像的直方图,使其充满整个灰度等级范围内公式:g(x,y)255/(BA)f(x,y)A,其中,Aminf(x,y),最小
Stella981 Stella981
3年前
C++ OpenCV特征提取之积分图计算
前言什么是积分图像积分图像的定义:取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,使用这种方式得到的图像称为积分图像。为什么要用积分图像直方图的计算方法为遍历图像的全部像素并累计每个强度值在图像中出现的次数。有时仅需要计算图像中某个特定区域的直方图,而
Stella981 Stella981
3年前
OpenCV调整彩色图像的饱和度和亮度
问题如何调整彩色图像的饱和度和亮度解决思路详细步骤:1.将RGB图像值归一化到\0,1\2.然后使用函数cvtColor进行色彩空间的转换3.接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度和亮度分量4.最后转换到RGB色彩空间代码!/usr/bi
Stella981 Stella981
3年前
Opencv笔记(二十)——直方图(二)
直方图均衡化原理:  想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下这种操作会改善图像的对比度。直方图均衡化后面潜在的数
Stella981 Stella981
3年前
OpenCV阈值化处理
图像的阈值化就是利用图像像素点分布规律,设定阈值进行像素点分割,进而得到图像的二值图像。图像阈值化操作有多种方法,常用方法有经典的OTSU、固定阈值、自适应阈值、双阈值及半阈值化操作。这里对各种阈值化操作进行一个总结。OTSU阈值化在阈值化处理中,常用的算法就是OTSU。发明人是NobuyukiOstu。这种二值化操作阈值的选取非常重要,阈
马尚 马尚
7个月前
验证码识别实战
验证码是网站常用的一种安全验证手段,但是对于自动化程序来说,验证码可能是个难题。本文将介绍如何使用Python和一些常用的库来识别验证码图像。步骤1:预处理图像首先,我们需要对验证码图像进行预处理,以便更好地提取图像中的文本信息。预处理包括灰度化和二值化。