I need to perform color normalization on 55 images.
This is my code for color normalization:
function img = colornormalization(img_in)meanStdTarget=[77.5121 270.5718; 8.9287 -23.6535; 2.9664 8.3857];binry = rgb2gray(img_in);binry((binry>=215)) = 0;binry((binry~=0)) = 1;binry = ~binry;img=colorCorrect(img_in,meanStdTarget,binry);img=uint8(img*double(intmax('uint8')));endfunction img=colorCorrect(imgO,meanStdTarget,whiteMask)if isequal(class(imgO),'uint8') imgO=double(imgO)/double(intmax('uint8'));endlStd=meanStdTarget(1,1);lMT=meanStdTarget(1,2);aStd=meanStdTarget(2,1);aMT=meanStdTarget(2,2); bStd=meanStdTarget(3,1);bMT=meanStdTarget(3,2);if whiteMask ~=-1 nwMask =~ whiteMask;else nwMask=true(size(imgO,1),size(imgO,2));endindexWhitePixel=nwMask==false;labO=convertRGBToLAB(imgO);labO_l=labO(:,:,1);labO_a=labO(:,:,2);labO_b=labO(:,:,3);if any(indexWhitePixel(:)) labO_l=labO_l(nwMask); labO_a=labO_a(nwMask); labO_b=labO_b(nwMask);endlsbO=std(labO_l(:));lMO=mean(labO_l(:));asbO=std(labO_a(:));aMO=mean(labO_a(:));bsbO=std(labO_b(:));bMO=mean(labO_b(:));labO(:,:,1)=((labO(:,:,1)-lMO)/lsbO)*lStd+lMT;labO(:,:,2)=((labO(:,:,2)-aMO)/asbO)*aStd+aMT;labO(:,:,3)=((labO(:,:,3)-bMO)/bsbO)*bStd+bMT;RGB=convertLABToRGB(labO);RGB_r=RGB(:,:,1);RGB_g=RGB(:,:,2);RGB_b=RGB(:,:,3);imgR=imgO(:,:,1);imgG=imgO(:,:,2);imgB=imgO(:,:,3);imgR(nwMask)=RGB_r(nwMask);imgG(nwMask)=RGB_g(nwMask);imgB(nwMask)=RGB_b(nwMask);img(:,:,1)=imgR;img(:,:,2)=imgG;img(:,:,3)=imgB;endfunction imgLAB=convertRGBToLAB(imgT)imgR=imgT(:,:,1);imgG=imgT(:,:,2);imgB=imgT(:,:,3);channelVectors=[imgR(:)';imgG(:)';imgB(:)'];rgbToLMS=[0.3811 0.5783 0.0404; 0.1967 0.7244 0.0782; 0.0241 0.1288 0.8444];LMS=rgbToLMS * channelVectors;lmsToLab1=[1/sqrt(3) 0 0; 0 1/sqrt(6) 0; 0 0 1/sqrt(2)];lmsToLab2=[1 1 1;1 1 -2; 1 -1 0];LAB=lmsToLab1 * lmsToLab2 *LMS;imgLAB(:,:,1)=reshape(LAB(1,:),[size(imgT,1) size(imgT,2)]);imgLAB(:,:,2)=reshape(LAB(2,:),[size(imgT,1) size(imgT,2)]);imgLAB(:,:,3)=reshape(LAB(3,:),[size(imgT,1) size(imgT,2)]);endfunction imgRGB=convertLABToRGB(imgLAB)labToLMS1=[1 1 1;1 1 -1;1 -2 0];labToLMS2=[1/sqrt(3) 0 0; 0 1/sqrt(6) 0; 0 0 1/sqrt(2)];imgL=imgLAB(:,:,1);imgA=imgLAB(:,:,2);imgB=imgLAB(:,:,3);LAB=[imgL(:)';imgA(:)';imgB(:)'];LMS=labToLMS1*labToLMS2*LAB;lmsToRGB=[4.4679 -3.5873 0.1193; -1.2186 2.3809 -0.1624; 0.0497 -0.2439 1.2045];RGB=lmsToRGB * LMS;imgRGB(:,:,1)=reshape(RGB(1,:),[size(imgLAB,1) size(imgLAB,2)]);imgRGB(:,:,2)=reshape(RGB(2,:),[size(imgLAB,1) size(imgLAB,2)]);imgRGB(:,:,3)=reshape(RGB(3,:),[size(imgLAB,1) size(imgLAB,2)]);imgRGB=imgRGB/double(intmax('uint8'));end
Now in a another matlab file I am writing the code for reading all 55images and then processing it.
addpath('myfiledirectory');fileFolder = 'myfiledirectory'; dirOutput = dir(fullfile(fileFolder,'*.tif')); store={1:55}; c={1:55}; for k = 1 : length(dirOutput) A = dirOutput(k).name; B= fullfile(fileFolder,A); c(i)=imread(B); store(i)=colornormalization(c(i)); end monatge(store,'size',[5,11]);
Best Answer