python实现直方图规定化

图像增强及直方图处理简介

直方图规定化属于图像增强技术的一种

图像增强目的是改善图像的视觉效果,便于对图像的分析和处理,其包括直方图处理、空域滤波、频域滤波等方法。

直方图处理是指根据图像的灰度分布特点,经过变换和处理以改变原有直方图形状,也就是仅将灰度(色深值)做映射,新图像中像素的灰度(色深值)取决于原图像中该像素的灰度(色深值),其包括灰度图均衡化和灰度图规定化。



一、灰度直方图规定化

灰度直方图表达一帧图像灰度级分布情况,其横坐标是灰度值r,纵坐标是灰度值为r的像素个数或出现此灰度值的概率。

灰度直方图均衡化的基本思想是对原始图像中的像素灰度做某种映射变换,使变换后图像灰度的概率密度均匀分布,即变换后的图像是一副灰度级均匀分布的图像,这意味着图像灰度的动态范围得到了增加,从而可以提高图像的对比度。但是灰度直方图均衡化的增强效果不易控制,因为它处理结果得到的是全局均衡化的直方图,另外均衡化的图像并不一定适合人的视觉特征和一些具体应用。


二、灰度直方图规定化

灰度直方图规定化就是把图像的直方图变换成特定的非均匀分布的形状,使其能够更好地突出图像中人们感兴趣的部分,以此得到更好的增强效果。规定化是仅针对局部灰度局域进行增强,正确地选择规定化的函数可以获得比直方图均衡化更好的图像增强效果,直方图规定化本质上即寻找一个从灰度级𝑘到f(t)的映射,使新的灰度级f(t)分布接近规定化的函数。

任务分析及算法实现

处理任务:给定两张图像,将其中一张图像的灰度直方图规定为另一张图像的灰度直方图。


处理时需要用cv2.calcHist 获取灰度级像素个数信息(即直方图信息),得到一个256*1的ndarray,每个灰度级对应的像素点个数; 另外会使用cv2.LUT 进行灰度级的映射操作,最后即可完成将一张图像的灰度直方图规定为另一张图像的灰度直方图。


1.得到图像各个灰度级的累计概率

代码如下(示例):

def get_Sk(Hist):
    # 计算概率分布Pr
    sum_Hist = sum(Hist)
    Pr = Hist / sum_Hist
    # 计算累计概率Sk
    Sk = []
    temp = 0
    for n in Pr:
        sk = temp + n
        Sk.append(sk)
        temp = sk
    Sk = np.asarray(Sk)
    return Sk

2.得到灰度级的映射表

代码如下(示例):

def get_lut(sk1, sk2):
    sk1 = sk1.squeeze()
    sk2 = sk2.squeeze()
    diff = np.tile(sk1, (sk2.shape[0], 1))
    a = 0
    for i in np.nditer(sk2):
        diff[a] = np.abs(diff[a] - i)
        a += 1
    index = np.argmin(diff, axis=0)
    return index.astype(np.uint8)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值