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

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

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 = min(img), 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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/567964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存