La couleur utilisée dans les imprimantes est soustractive. Elle utilise les trois couleurs primaires cyan (C), magenta (M) et jaune (Y). Les pages sur lesquelles nous imprimons sont blanche donc si C = M = Y = 0 pas d'encre est utilisé nous aurons donc du blanc sur la page. A contrario, si C = M = Y = 1 les trois encres sont utilisées donc la couleur obtenue sera noire. Une manière simple de calculer les trois composantes est :
Le programme Matlab :
C=(255-R);
M=(255-G);
Y=(255-B);
figure( 'Name','RGB --> CMY',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(321)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(323)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(325)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(322)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(324)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(326)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
et un exemple
La saturation des trois composantes CMY ne donne pas du noir en réalité, pour corriger ce problème on utilise généralement de l'encre noire pour compléter. Une technique simple pour calculer la composante de noir K est de faire :
On calcule les nouvelles composantes grâce à K.
On peux utiliser le programme suivant :
% conversion RGB --> CMYK
% methode 1
C=(255-R);
M=(255-G);
Y=(255-B);
K=min(cat(3,C,M,Y),[],3);
C=C-K;
M=M-K;
Y=Y-K;
figure( 'Name','RGB --> CMYK Methode 1',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(331)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(334)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(337)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(332)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(335)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(338)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
subplot(333)
imshow(uint8(cat(3,K,K,K)))
title('Image K')
Et un exemple
Une autre méthode consiste à réduire les composantes d'un facteur f ou : si et 1 si . On obtient donc
De cette manière si R = G = B alors l'imprimante n'utilisera que la cartouche noire.
voici le programme :
% conversion RGB --> CMYK
% methode 2
% normalisation
Rn=R/255;
Gn=G/255;
Bn=B/255;
Cn=(1-Rn);
Mn=(1-Gn);
Yn=(1-Bn);
Kn=min(cat(3,Cn,Mn,Yn),[],3);
Knp=Kn;
Kn=1./(1-Kn);
Kn(Kn==Inf)= 1;
Cn=(Cn-Knp).*Kn;
Mn=(Mn-Knp).*Kn;
Yn=(Yn-Knp).*Kn;
% dénormalisation
C=Cn*255;
M=Mn*255;
Y=Yn*255;
K=Knp*255;
figure( 'Name','RGB --> CMYK Methode 2',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(331)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(334)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(337)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(332)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(335)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(338)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
subplot(333)
imshow(uint8(cat(3,K,K,K)))
title('Image K')
Et un exemple
Avec
Le programme
% conversion RGB --> CMYK
% methode 3
% normalisation
Rn=R/255;
Gn=G/255;
Bn=B/255;
Cn=(1-Rn);
Mn=(1-Gn);
Yn=(1-Bn);
Kn=min(cat(3,Cn,Mn,Yn),[],3);
Sk = 0.1;
FucrK = Sk * Kn;
Ko = 0.3;
FBGK=(Kn<Ko)* (max(max(Kn))) .* (Kn-Ko)./(1-Ko);
Cn=(Cn-FucrK);
Mn=(Mn-FucrK);
Yn=(Yn-FucrK);
Kn=FBGK;
% dénormalisation
C=Cn*255;
M=Mn*255;
Y=Yn*255;
K=Knp*255;
figure( 'Name','RGB --> CMYK Methode 3',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(331)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(334)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(337)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(332)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(335)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(338)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
subplot(333)
imshow(uint8(cat(3,K,K,K)))
title('Image K')
Et un exemple
clear all;
close all;
[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
'*.*','All Files' },'mytitle',...
'C:\Work\myfile.jpg');
img = imread(filename);
[ligne colonne dimension]=size(img);
img=double(img);
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
Imax = max(max(img));
% conversion RGB --> CMY
C=(255-R);
M=(255-G);
Y=(255-B);
figure( 'Name','RGB --> CMY',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(321)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(323)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(325)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(322)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(324)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(326)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
% conversion RGB --> CMYK
% methode 1
C=(255-R);
M=(255-G);
Y=(255-B);
K=min(cat(3,C,M,Y),[],3);
C=C-K;
M=M-K;
Y=Y-K;
figure( 'Name','RGB --> CMYK Methode 1',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(331)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(334)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(337)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(332)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(335)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(338)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
subplot(333)
imshow(uint8(cat(3,K,K,K)))
title('Image K')
% conversion RGB --> CMYK
% methode 2
% normalisation
Rn=R/255;
Gn=G/255;
Bn=B/255;
Cn=(1-Rn);
Mn=(1-Gn);
Yn=(1-Bn);
Kn=min(cat(3,Cn,Mn,Yn),[],3);
Knp=Kn;
Kn=1./(1-Kn);
Kn(Kn==Inf)= 1;
Cn=(Cn-Knp).*Kn;
Mn=(Mn-Knp).*Kn;
Yn=(Yn-Knp).*Kn;
% dénormalisation
C=Cn*255;
M=Mn*255;
Y=Yn*255;
K=Knp*255;
figure( 'Name','RGB --> CMYK Methode 2',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(331)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(334)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(337)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(332)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(335)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(338)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
subplot(333)
imshow(uint8(cat(3,K,K,K)))
title('Image K')
% conversion RGB --> CMYK
% methode 3
% normalisation
Rn=R/255;
Gn=G/255;
Bn=B/255;
Cn=(1-Rn);
Mn=(1-Gn);
Yn=(1-Bn);
Kn=min(cat(3,Cn,Mn,Yn),[],3);
Sk = 0.1;
FucrK = Sk * Kn;
Ko = 0.3;
FBGK=(Kn<Ko)* (max(max(Kn))) .* (Kn-Ko)./(1-Ko);
Cn=(Cn-FucrK);
Mn=(Mn-FucrK);
Yn=(Yn-FucrK);
Kn=FBGK;
% dénormalisation
C=Cn*255;
M=Mn*255;
Y=Yn*255;
K=Knp*255;
figure( 'Name','RGB --> CMYK Methode 3',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
vide=zeros(ligne,colonne);
subplot(331)
imshow(uint8(cat(3,R,vide,vide)))
title('Image R origine')
subplot(334)
imshow(uint8(cat(3,vide,G,vide)))
title('Image G origine')
subplot(337)
imshow(uint8(cat(3,vide,vide,B)))
title('Image B origine')
subplot(332)
imshow(uint8(cat(3,vide,C,C)))
title('Image C')
subplot(335)
imshow(uint8(cat(3,M,vide,M)))
title('Image M')
subplot(338)
imshow(uint8(cat(3,Y,Y,vide)))
title('Image Y')
subplot(333)
imshow(uint8(cat(3,K,K,K)))
title('Image K')
Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr