1、简单介绍
将彩色图像转换为灰度图像是数字打印以及单通道图像和视频处理的关键步骤。论文的思想是尽量保持原始图像的对比度同时达到去色的效果。
在matlab中是通过rgb2gray函数将图像转换为灰度图像。gray=R0.299+G0.587+B*0.114是一种比较经典的灰度转换公式,结果如下。
原图
matlab中自带函数rgb2gray的结果
可以发现经过rgb2gray函数转换过的图像对比度丢失,无法区分颜色。
香港大学研究人员Cewu Lu Li Xu Jiaya Jia提出了一种对比度保留的灰度转换算法,达到不错的效果。
2、Real-time Contrast Preserving Decolorization论文思想
论文是在前人的方法上进行的改进,目的都是为了优化下面的能量函数来估计像素的灰度值。
其中gx,gy为优化后的图像灰度值,δx,y 为x,y两点的对比度,由Lab空间的欧式距离来确定。
从上面优化的能量函数来看目的就是为了优化转换后的每一个像素点灰度值差值Δgx,y和对比度的差值之和。根据这个思想作者进一步改写目标函数。
其中g是通过rgb三通道线性组合而来的。
其中wr,wg,wb系数满足下面约束条件,使得目标函数E(g)达到最小值:
3、论文的实现结果
原图
MATLAB中的rgb2gray(gray=R0.299+G0.587+B*0.114)函数灰度转换
论文结果实现的去色效果
4、相关matlab代码
其中优化满足约束条件的有无限种;论文使用的参数只是[0,1]之间每隔0.1的值,总共有66种。
function W= w()
W = [ 0, 0, 1.0000
0, 0.1000, 0.9000
0, 0.2000, 0.8000
0, 0.3000, 0.7000
0, 0.4000, 0.6000
0, 0.5000, 0.5000
0, 0.6000, 0.4000
0, 0.7000, 0.3000
0, 0.8000, 0.2000
0, 0.9000, 0.1000
0, 1.0000, 0
0.1000, 0, 0.9000
0.1000, 0.1000, 0.8000
0.1000, 0.2000, 0.7000
0.1000, 0.3000, 0.6000
0.1000, 0.4000, 0.5000
0.1000, 0.5000, 0.4000
0.1000, 0.6000, 0.3000
0.1000, 0.7000, 0.2000
0.1000, 0.8000, 0.1000
0.1000, 0.9000, 0
0.2000, 0, 0.8000
0.2000, 0.1000, 0.7000
0.2000, 0.2000, 0.6000
0.2000, 0.3000, 0.5000
0.2000, 0.4000, 0.4000
0.2000, 0.5000, 0.3000
0.2000, 0.6000, 0.2000
0.2000, 0.7000, 0.1000
0.2000, 0.8000, 0
0.3000, 0, 0.7000
0.3000, 0.1000, 0.6000
0.3000, 0.2000, 0.5000
0.3000, 0.3000, 0.4000
0.3000, 0.4000, 0.3000
0.3000, 0.5000, 0.2000
0.3000, 0.6000, 0.1000
0.3000, 0.7000, 0.0000
0.4000, 0, 0.6000
0.4000, 0.1000, 0.5000
0.4000, 0.2000, 0.4000
0.4000, 0.3000, 0.3000
0.4000, 0.4000, 0.2000
0.4000, 0.5000, 0.1000
0.4000, 0.6000, 0.0000
0.5000, 0, 0.5000
0.5000, 0.1000, 0.4000
0.5000, 0.2000, 0.3000
0.5000, 0.3000, 0.2000
0.5000, 0.4000, 0.1000
0.5000, 0.5000, 0
0.6000, 0, 0.4000
0.6000, 0.1000, 0.3000
0.6000, 0.2000, 0.2000
0.6000, 0.3000, 0.1000
0.6000, 0.4000, 0.0000
0.7000, 0, 0.3000
0.7000, 0.1000, 0.2000
0.7000, 0.2000, 0.1000
0.7000, 0.3000, 0.0000
0.8000, 0, 0.2000
0.8000, 0.1000, 0.1000
0.8000, 0.2000, 0.0000
0.9000, 0, 0.1000
0.9000, 0.1000, 0.0000
1.0000, 0, 0];
end
function img = rtcprgb2gray(im)
%% Proprocessing
[n,m,ch] = size(im);
sigma = 0.05;
W = w();
%% Global and Local Contrast Computing
ims = imresize(im, round(64/sqrt(n*m)*[n,m]),'nearest');
R = ims(:,:,1);G = ims(:,:,2);B = ims(:,:,3);
imV = [R(:),G(:),B(:)];
t1 = randperm(size(imV,1));
Pg = [imV - imV(t1,:)];
ims = imresize(ims, 0.5 ,'nearest');
Rx = ims(:,1:end-1,1) - ims(:,2:end,1);
Gx = ims(:,1:end-1,2) - ims(:,2:end,2);
Bx = ims(:,1:end-1,3) - ims(:,2:end,3);
Ry = ims(1:end-1,:,1) - ims(2:end,:,1);
Gy = ims(1:end-1,:,2) - ims(2:end,:,2);
By = ims(1:end-1,:,3) - ims(2:end,:,3);
Pl = [[Rx(:),Gx(:),Bx(:)];[Ry(:),Gy(:),By(:)]];
P = [Pg;Pl ];
det = sqrt(sum(P.^2,2))/1.41 ;
P( (det < 0.05),:) = []; det( (det < 0.05)) = [];
detM = repmat(det,[1,size(W,1)]); L = P*W';
%% Energy optimization
U = log(exp(- (L + detM ).^2/sigma.^2) + exp(- (L- detM).^2/sigma.^2));
Es = mean(U);
%% Output
[NULLval,bw] = max(Es);
img = imlincomb(W(bw,1),im(:,:,1) , W(bw,2),im(:,:,2) , W(bw,3),im(:,:,3));
end
clc
clear
I=im2double(imread('3.png'));
figure;imshow(I);
R=I(:,:,1);G=I(:,:,2);B=I(:,:,3);
gray=R*0.299+G*0.587+B*0.114;
figure;imshow(gray);
imwrite(gray,'7.png');
I2=rtcprgb2gray(I);
figure;imshow(I2);
imwrite(I2,'8.png');
添对比度保留之彩色图像去色算法 — 基础算法也可以上档次。
Real-time Contrast Preserving Decolorization