之前把matlab代码转python的时候转过这个函数。
最近自己动手发现还会用到,遂贴上来方便有需要的朋友们自取。
一句话解释:其实就是说,在人眼看来,亮度并不是线性变化的(对深色更敏感),所以需要做一个映射,来让人眼感觉色彩是均匀变化的。
这个映射就是所谓的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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)