【图像处理】gamma校正通俗解释及python实现(替代matlab imadjust)

Motivation

之前把matlab代码转python的时候转过这个函数。最近自己动手发现还会用到,遂贴上来方便有需要的朋友们自取。

Gamma校正(gamma correction)

一句话解释:其实就是说,在人眼看来,亮度并不是线性变化的(对深色更敏感),所以需要做一个映射,来让人眼感觉色彩是均匀变化的。这个映射就是所谓的gamma校正。

我们看下面这张图,左边在亮度上其实是均匀变化的,但是在我们人眼看来,深色数量远多于亮色。通过一个非线性校正后(右图),我们人眼看来就是均匀变化的了。这也就是gamma校正的目的。
在这里插入图片描述
实际测出来人眼需要的gamma值是2.2
在这里插入图片描述
(图片来源:Google)

想看详细解释的朋友们可以移步:https://www.zhihu.com/question/27467127

Python实现

import numpy as np

def imadjust(img, in_range=[0, 1], out_range=[0, 1], gamma=1):
    # 默认参数和matlab中的默认参数相同

    low_in, high_in = in_range[0], in_range[1]
    low_out, high_out = out_range[0], out_range[1]
    # 百分比截断
    p1, p99 = np.percentile(img, (1, 99))
    img_out = np.clip(img, p1, p99)

    # 映射 参考https://stackoverflow.com/questions/39767612/what-is-the-equivalent-of-matlabs-imadjust-in-python
    img_out = (((img_out - low_in) / (high_in - low_in)) ** gamma) * (high_out - low_out) + low_out

    return img_out

当然,如果不需要和matlab的参数一样,也可以自己实现一个版本

import numpy as np

def imadjust(img, out_range=[0, 1], gamma=1):
    # 默认参数和matlab中的默认参数相同
	
	# 百分比截断
    p1, p99 = np.percentile(img, (1, 99))
    img_out = np.clip(img, p1, p99)
    
    low_in, high_in = np.min(img), np.max(img)
    low_out, high_out = out_range[0], out_range[1]
    

    # 映射 参考https://stackoverflow.com/questions/39767612/what-is-the-equivalent-of-matlabs-imadjust-in-python
    img_out = (((img_out - low_in) / (high_in - low_in)) ** gamma) * (high_out - low_out) + low_out

    return img_out
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丫么小阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值