24小时热门版块排行榜    

查看: 1444  |  回复: 2

shn521

新虫 (初入文坛)

[交流] 【求助】帮忙看下这四个matlab算法,我是菜鸟已有2人参与

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

第一个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,:),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
回复此楼

» 收录本帖的淘贴专辑推荐

source

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

shn521

新虫 (初入文坛)

帮帮忙
2楼2011-02-27 09:50:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lhfx_313

至尊木虫 (文坛精英)


小木虫(金币+0.5):给个红包,谢谢回帖交流
写一个相同功能的 比看懂更容易。。。
3楼2011-02-27 11:47:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 shn521 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 化学口面上 +5 乐丰松庆 2024-05-23 6/300 2024-05-23 18:04 by ddr6021023
[考博] 海南大学国家级人才田新龙教授团队氢燃料电池与器件方向招收科研助理 (重点支持方向) +7 Dreammzp 2024-05-17 11/550 2024-05-23 15:56 by Dreammzp
[论文投稿] 为什么有的影响因子高的期刊分区不高呢? +7 安处一室 2024-05-21 7/350 2024-05-23 15:51 by 晓目崇
[论文投稿] wiely投稿状态 10+3 甄小鱼 2024-05-23 3/150 2024-05-23 15:42 by 莱茵润色
[硕博家园] 答辩 +6 暮色恋伊人 2024-05-22 6/300 2024-05-23 14:49 by zzwnty
[考博] 邀请申请深圳大学计算机与软件学院专业学位博士研究生(具身智能机器人方向) +3 Qiang_Li 2024-05-22 5/250 2024-05-23 14:28 by Qiang_Li
[论文投稿] Neurocomputing 外审结束 +5 mollyzhang_2003 2024-05-23 5/250 2024-05-23 12:03 by nono2009
[教师之家] 经常觉得挺累的 +9 zylfront 2024-05-22 15/750 2024-05-23 10:05 by ayalex
[教师之家] 优秀毕业论文 指导教师,普通老师有希望吗? +8 河西夜郎 2024-05-17 9/450 2024-05-23 10:02 by Fanninger
[教师之家] 执念 +9 459582015 2024-05-16 10/500 2024-05-22 19:28 by 预演556
[论文投稿] 期刊投稿进度 +6 jianhuang9 2024-05-21 8/400 2024-05-22 18:29 by sakuraai
[有机交流] 两个产物点爬小板离得非常近,怎么靠大板提纯 5+6 lljcb 2024-05-18 7/350 2024-05-22 16:35 by DAXIAOZHI
[基金申请] 国自然等 80+4 胖虎 2024-05-21 12/600 2024-05-22 09:47 by nono2009
[基金申请] 肿瘤口 +5 hml2091 2024-05-20 5/250 2024-05-21 22:48 by Liu131415
[论文投稿] 论文一审意见回来后发现实验程序编错了论证分析部分可能要大改 5+4 hshhenb 2024-05-20 5/250 2024-05-21 11:03 by bnullh
[论文投稿] SENSORS AND ACTUATORS B-CHEMICAL 15+4 荣小撇 2024-05-20 4/200 2024-05-21 10:07 by ca0yan9
[基金申请] 基金评审 +4 阿呆不呆 2024-05-20 4/200 2024-05-20 15:10 by 一路向东
[考博] 25年博士申请 +6 lixinmiao9 2024-05-18 6/300 2024-05-20 11:19 by 裴先生533
[论文投稿] Nano-Micro Letters投稿可以用PDF上传吗 5+4 962511369 2024-05-18 4/200 2024-05-19 15:47 by ca0yan9
[论文投稿] 投稿成功后又想撤回 +5 otani 2024-05-16 5/250 2024-05-17 16:02 by topedit
信息提示
请填处理意见