注意:这篇文章上次更新于1347天前,文章内容可能已经过时。
预备知识
Z-score 标准化方法
Z-score 标准化方法是一种数据标准化方法,这种方法给定原始数据的均值(mean)和标准差(standard deviation) 进行数据的标准化,经过处理的数据均值为 0 ,方差为 1 。
其中, 为原始数据的均值, 为原始数据的标准差。
其效果如下图所示:
原始数据的分布直方图
原始数据的均值和标准差分别为 0.25 和 0.1
处理后的数据直方图分布
处理后数据的均值和标准差分别为 0 和 1
Sigmoid 函数
Sigmoid 函数是一个具有 S 形曲线的函数,是良好的阈值函数,在(0 , 0.5)处中心对称,在(0,0.5)附近具有较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值会无限趋近于 1 和 0 。
Sigmoid 函数的曲线如图:
算法简介
首先对输入图像分通道进行 Z-score 数据标准化:
其中 \in {R , G , B}$ , 为输入数据的均值, 为输入数据的标准差。
将此标准化数据输入 Sigmoid 函数实现数据的归一化。
我们根据此标准化图像 N 计算 值,用于对原图像进行非线性的颜色校正。
其中:
Matlab 算法实现
数据归一化
function [outputs] = Normalize(arg,str)
if nargin == 1
str = 'Line';
end
if strcmp(str,'Line')
MAX = max(arg(:));
MIN = min(arg(:));
outputs = (arg - MIN)./ (MAX - MIN);
end
if strcmp(str,'sigmoid')
u = mean(arg(:));
s = std(arg(:));
tmp = (arg - u)./ s;
outputs = 1 ./ (1 + exp(-tmp));
end
if strcmp(str,'log')
alpha = max(arg(:)) + 1;
outputs = log(arg + 1) ./ log(alpha);
end
end
颜色校正
function output = MyCC(input)
I = im2double(input);
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
NR = Normalize(R,'sigmoid');
NG = Normalize(G,'sigmoid');
NB = Normalize(B,'sigmoid');
gammar = mean2(R ./ NR);
gammag = mean2(G ./ NG);
gammab = mean2(B ./ NB);
output(:,:,1) = R .^ gammar;
output(:,:,2) = G .^ gammag;
output(:,:,3) = B .^ gammab;
end
实验结果
Li-Chongyi 的图片
左为原图,右为结果图。
WB Images
左为原图,右为结果图。
小声说ฅʕ•̫͡•ʔฅ
这个方法其实就是融合了最近刚刚发现的一种归一化方法和小红师姐现在的颜色校正算法。这个归一化是真的好用,我还要再用。😁
从实验结果上看和小红师姐原来方法的结果也极其相似,我试了一些原方法会毁掉的一些图片,现在依然会毁掉,大概就是那种图片要谨慎使用伽马校正吧。
把这个方法可以作为图像增强框架的预处理步骤,这些图片应该已经足够发一篇 高水 平论文了吧。
最后还要说一个可怕的事实:
这个 Sigmoid 归一化实在是太牛逼了,很多时候归一化后的图像 N 就已经很优秀了(起码从 Color Cast 的角度看)。
左为原图 input;中为本算法结果图 output;右为中间结果 N
那么问题来了,如果不加伽马校正,就一个归一化算创新吗?可是多数情况加了还不如不加,难受😭
本着“没有最水,只有更水”的写论文原则,就暂且忽略这个事实吧。
但是根据我对另一句名言的理解,即总有一张图片适合你的算法,我要强行解释我伽马校正的意义,对于下图来说,N 是不是存在着过度的增强呢?
左为原图 input;中为本算法结果图 output;右为中间结果 N