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

Motivation

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

Gamma校正(gamma correction)

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

我们看下面这张图,左边在亮度上其实是均匀变化的,但是在我们人眼看来,深色数量远多于亮色。通过一个非线性校正后(右图),我们人眼看来就是均匀变化的了。这也就是gamma校正的目的。
【图像处理】gamma校正通俗解释及python实现(替代matlab imadjust)_第1张图片
实际测出来人眼需要的gamma值是2.2
【图像处理】gamma校正通俗解释及python实现(替代matlab imadjust)_第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

你可能感兴趣的:(图像处理,python,计算机视觉,深度学习,人工智能,图像处理)