color correction of camera output

i have an image that taken from manually controlled color options camera. it has some error about colors. i tried to fix them by taking 3 different pixel of the image and took also these 3 pixels real values in terms of rgb values. and i get a 3x3 matrix to correct the hole image. it is basicly working. i get some good result but i have to correct totally. how can i fix the images color. output of my image
after my process
how can i fix these errors

7 Comments

I do not understand the question nor the problem that you want to solve
the first image is output of camera and i want to correct its color. but as you can see my output after matlab process has some errors such as its shape and it consist of seen squares. i want to get the result shapes are same as the first image and colors are like second image. how can get this result
Please post your code.
imdir='C:\Users\infodif\Desktop\';
imfile='11.png';
im=imread([imdir, imfile]);
R=im(:,:,1); G=im(:,:,2); B=im(:,:,3);
r=R(:); g=G(:); b=B(:);
D=[r,g,b];
K=[179 161 46; 103 240 235; 19 63 132];
O=[250 141 22; 250 250 250; 47 5 154];
k=inv(K);
A=k*O;
n=size(im,1); m=size(im,2);
C=double(D)*double(A);
C=uint8(C);
R1=C(:,1); G1=C(:,2); B1=C(:,3);
for j=0:(m-1)
for i=1:n
rc(i,j+1)=R1(i+j*n ,:);
i=i+1;
end
j=j+1;
end
for j=0:(m-1)
for i=1:n
gc(i,j+1)=G1(i+j*n ,:);
i=i+1;
end
j=j+1;
end
for j=0:(m-1)
for i=1:n
bc(i,j+1)=B1(i+j*n ,:);
i=i+1;
end
j=j+1;
end
RGB(:,:,1)=rc;
RGB(:,:,2)=gc;
RGB(:,:,3)=bc;
imshow(RGB)
this code is trying to correct image by taking 3 pixel rgb values from the camera output and real color values and obtaining at least square matrix then multiplying the image with this 3x3 matrix. but result is not good enough
are there any pne who can help me about this
1) Dude, it's been an hour, chill out. 2) Are you using the image acquisition toolbox to get the images? I know there's a property where you can change the HSB / RGB values of the camera. After you initalize the camera you can go to get(vid) to see all the properties. Something in there will allow you to adjust the color. Use preview(vid) to see how it looks.
with imaqtool command, the image acquisition toolbox was opened and i get first image start acquisition command. i mean 11.png is product of image acquisition toolbox. my aim is that there are camera settings in image acquisition toolbox and i canceled the auto white balanced or other auto option. and the whole options are controlled manually. and i took an image from this camera and try to correct the color of it

Sign in to comment.

Answers (1)

Image Analyst
Image Analyst on 4 Jul 2012
Edited: Image Analyst on 4 Jul 2012
I have color correction code (as everyone might expect). It's robust and versatile but it's almost 1000 lines long. Basically it looks like you're trying to do RGB-to-RGB color correction using a "linear single channel" model with no offset. I know the ICC color profiles use that model but it is very primitive and professional color correction software uses better models. I guess you'd also agree since you say your result is not good enough. This primitive model could be fine in some situations, but for more accuracy you might want to add a constant term to your model, and possibly higher order terms and cross channel terms. So to add a constant term to your model, your matrix in your least squares model would be
1 R1 G1 B1
1 R2 G2 B2
1 R3 G3 B3
...
1 RN GN BN
You could even go to higher order like quadratic and include cross terms like R*G to get better correction. N should be more than 3 points like you use. You should have around 20-30 points (actual pixel colors) in the image to train your model, and the "desired" values for each of those actual pixel colors. Have you considered using the X-rite Color Checker Chart? It's an industry standard for color correction. I usually use a linear cross channel correction if I just expect things like intensity changes but sometimes use a quadratic cross channel model if I think there might be a change in the color temperature of the lighting. If you go higher, like cubic, then you'll get better correction at the training colors but for all other colors the corrected colors tend to blow up and go haywire, just like any higher order fitting that you're familiar with. A linear cross channel model would look like:
1 R1 G1 B1 R1*G1 R1*B1 G1*B1
1 R2 G2 B2 R2*G2 R2*B2 G2*B2
1 R3 G3 B3 R3*G3 R3*B3 G2*B3
...
1 RN GN BN RN*GN RN*BN GN*BN
Of course you'd have one regression for each color, plugging in the actual reds and the desired reds, the actual greens and the desired green, and the actual blues and the desired blues. So you get three sets of coefficients out alpha, beta, and gamma. To get your corrected red color for some arbitrary test pixel you'd do
correctedRed = alpha(1) + alpha(2)*Rtest + alpha(3)*Gtest + alpha(4)*Btest + alpha(5)*Rtest*Gtest + alpha(6)*Rtest*Btest + alpha(7)*Gtest*Btest
Disclaimer - I think that's right but I didn't consult my code. Anyway, then you do the same with beta to get the corrected green and with the gamma to get the corrected blue:
correctedGreen = beta(1) + beta(2)*Rtest + beta(3)*Gtest + beta(4)*Btest + beta(5)*Rtest*Gtest + beta(6)*Rtest*Btest + beta(7)*Gtest*Btest
correctedBlue = gamma(1) + gamma(2)*Rtest + gamma(3)*Gtest + gamma(4)*Btest + gamma(5)*Rtest*Gtest + gamma(6)*Rtest*Btest + gamma(7)*Gtest*Btest

2 Comments

your last suggestion gives me nothing because
A=[Rtest Gtest Btest]
[correctedRed correctedGreen correctedBlue]=[Rtest Gtest Btest Rtest*Gtest Rtest*Btest Gtest*Btest]*[alpha(1);alpha(2);alpha(3);alpha(4);alpha(5);alpha(6);alpha(7)];
i know the first 2 matrix.
first one C matrix
second one A matrix so,
C=A*[alpha()]
[alpha()]=inv(A'*A)*A'*C;
but inv(A'*A) is infinite because det(A'*A)=0 then i try this
C=[240 240 240; 225 113 0; 13 27 94];
R1=96; R2=181; R3=19;
G1=225; G2=162; G3=63;
B1=220; B2=57; B3=132;
A=[1 R1 G1 B1 R1*G1 R1*B1 G1*B1;
1 R2 G2 B2 R2*G2 R2*B2 G2*B2;
1 R3 G3 B3 R3*G3 R3*B3 G3*B3;];
AA=transpose(A);
T=(inv(AA*A)*AA)*C;
G1=[ones(m*n,1), D, r.*g, r.*b, g.*b];
M=double(G1)*double(T);
then min(M) and max(M) is out of 255 too much such as 500 and -300 so,
M1=(M(:,1)+307).*(250/900);
M2=(M(:,2)+247).*(250/643);
M3=(M(:,3)+206).*(250/544);
result colors are not match the real objects
result is not good again however better than 3 pixel.
source image
result image
some colors are not match such as 2 colorful piece of paper.
how can i improve this method?
also i will try the other methods you suggest.
in your suggestions, my main problem after i run these codes is i get a correction matrix like for 3 pixels but more pixel. when i applied this matrix to the image which i tried to fix, the result values of pixels are too much and too small for rgb colors such as -70 and 700. after i tried to get 0-255 values by addition and divided this -70 and 700 values, the colors were not expected.

Sign in to comment.

Asked:

on 4 Jul 2012

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!