在直方图的基础之上,考虑均值方差匹配(本质上根据直方图完成一次线性映射,y=kx+b;),来达到颜色匹配的效果。(颜色匹配在PS软件上也有类似功能)
匹配分为两个阶段:第一阶段,在HSV空间下对S、V通道进行匹配,H通道不变。会有些许色片。(对于HSV空间的理解,此处不足解释,自己查阅资料看)
第二阶段,将HSV空间下做好的匹配图转换到RGB空间下,在对R、G、B三通道分别进行匹配。这样就完成了。
过程中(指导老师提供了思想),遇到问题冷静思考解决,一步步去测试(直方图、均值、方差、映射系数、映射矩阵。。。)
自己碰到的麻烦;变量名的误写,最终的映射代码逻辑写反了(这个逻辑读者一定要注意)。
以下只给出HSV空间下的匹配代码(RGB空间用到的匹配思想是一样的,读者自行学习编写):
clear all;
close all;
clc;
%注意点乘和乘的区别
src=imread('E:\毕设图片\颜色匹配\source.jpg');
tar=imread('E:\毕设图片\颜色匹配\target.jpg');
src=mat2gray(src);
tar=mat2gray(tar);%归一化
[m,n,dim]=size(src);
[m,n,dim]=size(tar);
%%读取待匹配图像,将其的RGB转换成HSV
src_R=src(:,:,1);
src_G=src(:,:,2);
src_B=src(:,:,3);
%RGB—>HSV
src_H=zeros(m,n); %色相角
src_S=zeros(m,n); %饱和度
src_V=zeros(m,n); %明度
for i=1:m
for j=1:n
r=src_R(i,j);
g=src_G(i,j);
b=src_B(i,j);
MAX=max([r,g,b]);
MIN=min([r,g,b]);
if MAX==MIN
src_H(i,j)=0;
elseif MAX==r && g>=b
src_H(i,j)=60*(g-b)/(MAX-MIN);
elseif MAX==r && g<b
src_H(i,j)=60*(g-b)/(MAX-MIN)+360;
elseif MAX==g
src_H(i,j)=60*(b-r)/(MAX-MIN)+120;
elseif MAX==b
src_H(i,j)=60*(r-g)/(MAX-MIN)+240;
end
if MAX==0
src_S(i,j)=0;
else
src_S(i,j)=1-MIN/MAX;
end