matlab p1xp2,有学图像的吗?帮忙看看四个MATLAB算法

帮忙看看这四个算法的作用,最好能讲解和对比下,非常感谢。

第一个grayWorld.m

function grayWorld(filename,outFile,catType,maxIter,plots)

%grayWorld(filename,outfile,catType,maxIter,plot)

% Performs color balancing via the gray world assumption and a chromatic

% adpatation transform.  Can be run interatively to possibly improve the

% result.  Set plot = 0 or 1 to turn diagnostic plots on or off.

tutorialinit

%% import image

im_orig = cbimread(filename);

% figure

% imshow(im_orig)

% title('Original Image')

%% various constants

xyz_D65 = [95.04; 100; 108.88]; %http://en.wikipedia.org/wiki/D65, normalized Y = 100

sRGBtoXYZ =   [0.4124564  0.3575761  0.1804375; ...

0.2126729  0.7151522  0.0721750; ...

0.0193339  0.1191920  0.9503041];

%% grayworld

% catType = 'vonKries';

% maxIter = 1;

b = 0.001; %convergence threshold

imRGB_orig = cbreshape(im_orig)*255;

imRGB = imRGB_orig;

grayDiff =[];

for iter = 1:maxIter

rgbEst = mean(imRGB,2); %grayworld, average everything

grayDiff = [grayDiff norm([rgbEst(1)-rgbEst(2),rgbEst(1)-rgbEst(3),rgbEst(2)-rgbEst(3)])];

if grayDiff(end) < b

disp(['Converged. RGB difference vector < ' num2str(b) ' in magnitude.'])

break

elseif iter >= 2 && abs(grayDiff(end-1)-grayDiff(end)) < 10^-6

disp(['RGB difference vector no longer improving.'])

break

end

xyEst = XYZ2xy(sRGBtoXYZ*rgbEst); %calculate xy chromaticity

xyzEst = xy2XYZ(xyEst,100); %normalize Y to 100 so D65 luminance comparable

imRGB = cbCAT(xyzEst,xyz_D65,catType)*imRGB;

end

imwrite(cbunshape(imRGB,size(im_orig))/255,outFile,'png');

if plots

length(grayDiff) %number of iterations done

%     figure

%     imshow(cbunshape(imRGB,size(im_orig))/255)

%     title('Gray World Corrected')

figure

plot(grayDiff)

title('GW: Norm of RGB Difference Vector vs Iterations')

print(gcf,'-dpng',[outFile '-fig1'])

end

第二个simplestColorBalance.m

function simplestColorBalance(filename,outFile,satLevel,plots)

%simplestColorBalance(filename,outFile,satLevel,plot)

% Performs color balancing via histogram normalization.

% satLevel controls the percentage of pixels to clip to white and black.

% Set plot = 0 or 1 to turn diagnostic plots on or off.

tutorialinit

%% import image

im_orig = cbimread(filename);

% figure

% imshow(im_orig)

% title('Original Image')

%% full width histogram method

% satLevel = .01; %percentage of the image to saturate to black or white, tweakable param

q = [satLevel/2 1-satLevel/2];

imRGB_orig = cbreshape(im_orig)*255;

imRGB = zeros(size(imRGB_orig));

N = size(imRGB_orig,2);

color = {'r','g','b'};

for ch = 1:3

if plots

figure

subplot(211)

hist(imRGB_orig(ch,

bbfad769acc09663901692695d2f5ad4.gif,256)

set(findobj(gca,'Type','patch'),'FaceColor',color{ch},'EdgeColor',color{ch})

xlim([0 255])

title('Original Histogram')

end

tiles = quantile(imRGB_orig(ch,:),q);

%     [sum(imRGB_orig(ch,:)tiles(2))/N] %check percentages are correct

imRGB(ch,:) = cbsaturate(imRGB_orig(ch,:),tiles); %saturate at the appropriate pts. in distribution

bottom = min(imRGB(ch,:)); top = max(imRGB(ch,:));

imRGB(ch,:) = (imRGB(ch,:)-bottom)*255/(top-bottom);

if plots

subplot(212)

hist(imRGB(ch,:),256)

set(findobj(gca,'Type','patch'),'FaceColor',color{ch},'EdgeColor',color{ch})

xlim([0 255])

title('Corrected Histogram')

end

print(gcf,'-dpng',[outFile '-fig' num2str(ch)])

end

imwrite(cbunshape(imRGB,size(im_orig))/255,outFile,'png');

% figure

% imshow(cbunshape(imRGB,size(im_orig))/255)

% title('Simplest Color Balance Corrected')

第三个robustAWB.m

function robustAWB(filename,outFile,option,catType,T,maxIter,plots)

%robustAWB(filename,outFile,option,catType,T,maxIter,plot)

% Performs robust auto white-balancing by estimating gray pixels based on

% their deviation in YUV space then applying an iterative correction via

% CAT or directly adjusting the R and B channels.

% Set option = 'RB gain' or 'cat' for the correction method.

% Set T higher for a larger threshold of deviation to consider off-gray.

% Set plot = 0 or 1 to turn diagnostic plots on or off.

tutorialinit

%% import image

im_orig = cbimread(filename);

% figure

% imshow(im_orig)

% title('Original Image')

%% various constants

xyz_D65 = [95.04; 100; 108.88]; %http://en.wikipedia.org/wiki/D65, normalized Y = 100

sRGBtoXYZ =   [0.4124564  0.3575761  0.1804375; ...

0.2126729  0.7151522  0.0721750; ...

0.0193339  0.1191920  0.9503041];

%% robust auto white balance - YUV grays

% option = 'RB gain'; % adjustments are done as a gain to only R or B channelas descripted in Huo

% option = 'cat';

% catType = 'CAT02';

% maxIter = 1000;

% T = 0.3; %this should be tweakable slider

% T = 0.1;

% gain adjustment parameters, can probably be optimized via more control system analysis

u = .01; %gain step size

a = .8; %double step threshold

b = .001; %convergence threshold

% rgb to yuv

xfm =   [0.299 0.587 0.144; ...

-0.299 -0.587 0.886; ...

0.701 -0.587 -0.114];

inv_xfm = inv(xfm);

imRGB_orig = cbreshape(im_orig)*255;

imRGB = imRGB_orig;

gain = [1 1 1];

U_avg = [];

V_avg = [];

totGray = [];

for iter = 1:maxIter

im = xfm*imRGB; %convert to YUV

% find gray chromaticity

% (|U|+|V|)/Y

F = ( abs(im(2,:)) + abs(im(3,:)) )./im(1,:);

%     figure

%     imshow(cbunshape(imRGB/255.*repmat(F

%     % imshow(cbunshape(inv_xfm)*im+[F>T;zeros(2,length(F))],size(im_orig))) %rubylith overlays

%     title('Gray Pixels Found by Robust AWB'),xlabel('Pixels in their original color are considered gray')

totGray = [totGray sum(F

if totGray(end) == 0

disp('No valid gray pixels found.')

break

end

grays = im(:,F

U_bar = mean(grays(2,:));

V_bar = mean(grays(3,:));

U_avg = [U_avg U_bar];

V_avg = [V_avg V_bar];

if strcmpi(option,'cat')

if max(abs([U_bar V_bar])) < b

disp(['Converged. U_bar and V_bar < ' num2str(b) ' in magnitude.'])

break

elseif iter >= 2 && norm([U_avg(end)-U_avg(end-1) V_avg(end)-V_avg(end-1)]) < 10^-6

disp(['U_bar and V_bar are no longer improving.'])

break

end

rgbEst = inv_xfm*[100;U_bar;V_bar]; %convert the average gray from YUV to RGB

xyEst = XYZ2xy(sRGBtoXYZ*rgbEst); %calculate xy chromaticity

xyzEst = xy2XYZ(xyEst,100); %normalize Y to 100 so D65 luminance comparable

imRGB = cbCAT(xyzEst,xyz_D65,catType)*imRGB;

else

if abs(U_bar) > abs(V_bar) % U > V; blue needs adjustment

err = U_bar;

ch = 3; %blue channel

else

err = V_bar;

ch = 1; %red channel

end

if abs(err) >= a

delta = 2*sign(err)*u; %accelerate gain adjustment if far off

elseif abs(err) < b %converged

delta = 0;

disp(['Converged. U_bar and V_bar < ' num2str(b) ' in magnitude.'])

break

else

delta = err*u;

end

%         [err,delta]

gain(ch) = gain(ch)-delta; %negative fdbk loop

imRGB = diag(gain)*imRGB_orig;

end

end

imwrite(cbunshape(imRGB,size(im_orig))/255,outFile,'png');

% figure

% imshow(cbunshape(imRGB,size(im_orig))/255)

% title('Robust AWB Corrected')

if plots

length(U_avg)

figure

plot(totGray)

title('rAWB: Total Gray Pixels vs Iterations')

print(gcf,'-dpng',[outFile '-fig1'])

figure

hold on

plot(U_avg,'b')

plot(V_avg,'r')

hold off

title('rAWB: Mean Chromaticity vs Iterations')

legend('U','V')

print(gcf,'-dpng',[outFile '-fig2'])

figure

imshow(cbunshape(imRGB/255.*repmat(F

% imshow(cbunshape(inv_xfm)*im+[F>T;zeros(2,length(F))],size(im_orig))) %rubylith overlays

title('Gray Pixels Found by Robust AWB'),xlabel('Pixels in their original color are considered gray')

print(gcf,'-dpng',[outFile '-fig3'])

end

第四个sensorCorrelation.m

function sensorCorrelation(filename,outFile,catType,plots)

%sensorCorrelation(filename,outFile,catType,plot)

% Performs the sensor correlation method for illuminant estimation and then

% a chromatic adaptation transform for correction.

% Set plot = 0 or 1 to turn diagnostic plots on or off.

% clear

tutorialinit

load refGamut.mat %a sample set of reference gamuts simulated by ISET for mired = 118:23.5:400

xyz_D65 = [95.04; 100; 108.88]; %http://en.wikipedia.org/wiki/D65, normalized Y = 100

%% import image

im_orig = cbimread(filename);

% figure

% imshow(im_orig)

% title('Original Image')

%% sensor correlation

clipVal = 225;

imRGB_orig = cbreshape(im_orig)*255;

imRGB = imRGB_orig;

%% pre-process

imRGB = imRGB(:,max(imRGB,[],1)= 225+1 since we will saturate later

%populate color space

imRGBSpace = zeros(clipVal+1,clipVal+1,clipVal+1,'uint8');

for i=1:size(imRGB,2)

c = imRGB(:,i);

imRGBSpace(c(1)+1,c(2)+1,c(3)+1) = imRGBSpace(c(1)+1,c(2)+1,c(3)+1) || 1;

end

%compute connectivity lookup table

% imRGBSpaceConn = imfilter(imRGBSpace,conndef(size(imRGB,1),'maximal')).*imRGBSpace>2; %only keep colors that are connected to more than 2 neighbors

%the above is the truly correct way but since we'll never access the color

%entries not in the image, we don't need to zero them out, this is good enough and faster

imRGBSpaceConn = imfilter(imRGBSpace,conndef(size(imRGB,1),'maximal'))>2; %must have more than 1 neighbor

imRGBConn = false(1,size(imRGB,2));

for i=1:length(imRGBConn)

c = imRGB(:,i);

imRGBConn(i) = imRGBSpaceConn(c(1)+1,c(2)+1,c(3)+1);

end

imRGB = imRGB(:,imRGBConn); %keep only pixels in the image with connected color values

clear imRGBSpaceConn imRGBSpace imRGBConn

imRGB = imRGB(:,max(imRGB,[],1)= 225, saturated

% normalize

I = zeros(1,size(imRGB_orig,2));

for i = 1:length(I)

I(i) = norm(imRGB_orig(:,i)); %sqrt(R^2+G^2+B^2)

end

imRGB = 255*imRGB/max(I);

%%

[gamut_im,gamutArea_im] = convhull(imRGB(1,:),imRGB(3,:)); %image gamut is the convex hull of (R,B) points

[x,y] = poly2cw(imRGB(1,gamut_im), imRGB(3,gamut_im));

gamut_im = [x; y]; %the image gamut vertices

% gamut_illum =[]; %gamuts of typical illuminants %2xnx# illum

% gamutArea_illum = []; % # illum x 1

kScale = .1:.1:1;

corr = zeros(length(kScale),length(gamutArea_illum)); %rows are scaling, cols are different illuminants

for j=1:length(kScale)

k = kScale(j);

for i = 1:length(gamut_temps)

gi = gamut_illum{i};

[x,y] = polybool('&',k*gamut_im(1,:),k*gamut_im(2,:),gi(1,:),gi(2,:));

corr(j,i) = polyarea(x,y)/sqrt(gamutArea_im*gamutArea_illum(i));

end

end

% corr

[corr,k] = max(corr,[],1);

[maxCorrVal,targetIllum] = max(corr);

k = k(targetIllum);

T = gamut_temps(targetIllum)

%% correct

xyzEst = xy2XYZ(XYZ2xy(gamut_XYZ(:,targetIllum)),100); %xyz color cast estimate normalized Y to 100

% catType = 'vonKries';

imRGB = imRGB_orig;

imRGB = cbCAT(xyzEst,xyz_D65,catType)*imRGB;

% figure

% imshow(cbunshape(imRGB,size(im_orig))/255)

% title(['Sensor Correlation Corrected, T=' num2str(T)])

imwrite(cbunshape(imRGB,size(im_orig))/255,outFile,'png');

%% plot

if plots

figure,clf

title('Gamut Plots')

for i=1:length(gamut_temps)

gi = gamut_illum{i};

x = gi(1,:);

y = gi(2,:);

hold on

if i == targetIllum

patch(x, y, 1, 'FaceColor', 'b')

else

patch(x, y, 1, 'FaceColor', 'g')

end

hold off

end

hold on

% plot(imRGB(1,:),imRGB(3,:),'.')

patch(gamut_im(1,:), gamut_im(2,:), 1, 'FaceColor', 'r')

hold off

print(gcf,'-dpng',[outFile '-fig1'])

end

% [k2,a2] = convhull(x2,y2);

%

% [xp1,yp1] = poly2cw(x1(k1),y1(k1));

% [xp2,yp2] = poly2cw(x2(k2),y2(k2));

% % xp1 = x1(k1); yp1 = y1(k1);

% % xp2 = x2(k2); yp2 = y2(k2);

%

%

% [x,y] = polybool('&',xp1,yp1,xp2,yp2);

%

% % figure(10),clf

% % hold on

% % patch(x, y, 1, 'FaceColor', 'g')

% % plot(x1,y1,'.',x2,y2,'r.')

% % plot(x1(k1),y1(k1),'-',x2(k2),y2(k2),'r-')

% % hold off

%

% corr = polyarea(x,y)/sqrt(a1*a2)

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值