24小时热门版块排行榜    

查看: 1449  |  回复: 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的回帖
相关版块跳转 我要订阅楼主 shn521 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 博士后创新人才支持计划公示 +9 aishida144 2024-06-14 15/750 2024-06-16 09:52 by msjy
[有机交流] 车间生产,真空度很高,温度很高,但减压蒸馏速度很慢。 10+12 召唤鬼泣lL 2024-06-13 36/1800 2024-06-16 09:20 by ddc805
[基金申请] 希望今年自己国自然面上项目和老婆青年项目能中! +6 恐龙爸爸 2024-06-14 6/300 2024-06-16 08:41 by shl2112501
[教师之家] 关于2023的收入 +33 小龙虾2008 2024-06-10 34/1700 2024-06-15 23:01 by zeolitess
[文学芳草园] 累并快乐着 +13 MYHLD521 2024-06-14 13/650 2024-06-15 22:59 by zeolitess
[基金申请] 博后面上今天有bug可以看到是否资助? +20 lyfbangong 2024-06-12 31/1550 2024-06-15 21:18 by since—2010
[考博] 上海交大招收材料化学方向科研助理/“申请考核”博士(请勿回复帖子或站内投条) +3 灵梦and紫 2024-06-12 4/200 2024-06-15 20:58 by 1822836277
[基金申请] Nature 11日发文,中国著名学者们称造假迫不得已 +5 babu2015 2024-06-14 5/250 2024-06-15 20:40 by lc231001
[基金申请] 2024国社科通讯评审 +9 qsd10086 2024-06-13 14/700 2024-06-15 15:51 by thesuna
[教师之家] 饶议:什么制度能保障大学普通教师不用为领导拎包,不用看领导脸色 +8 zju2000 2024-06-12 14/700 2024-06-15 13:59 by chemhua
[基金申请] 有没有机械的前辈分享一下评上海优都是什么成果啊 +7 wulala800 2024-06-10 7/350 2024-06-15 09:33 by 晓目崇
[基金申请] 博后基金,以往的结果点不开,怎么回事呢?最后一次机会了,两次都没中前面。 +7 kyukitu 2024-06-14 13/650 2024-06-15 06:46 by 我是王小帅
[基金申请] 工材E口JQ有消息了吗 +4 babyduck 2024-06-11 4/200 2024-06-14 17:23 by firepick
[基金申请] E12面上申请 +4 汉风之遗 2024-06-13 4/200 2024-06-14 15:28 by 天外飞去来
[基金申请] 化学会年会改成一年开一次了? +5 babu2015 2024-06-12 13/650 2024-06-14 10:46 by babu2015
[有机交流] 旋蒸请教 +6 办公室摸鱼 2024-06-09 9/450 2024-06-13 21:31 by wuxiaominggo
[基金申请] 连续两年医学口青年项目初审体会 +11 进击的荣耀 2024-06-09 18/900 2024-06-13 17:27 by 进击的荣耀
[有机交流] 原料反应完了,怎么知道是产物还是中间体 +6 小胡在努力 2024-06-11 8/400 2024-06-13 13:33 by 091602
[论文投稿] with editor日期变更 +3 慎独的小花卷 2024-06-12 8/400 2024-06-13 11:00 by 慎独的小花卷
[基金申请] 博后特助这周出结果吗?往年都是啥时候啊? +13 jsqy 2024-06-12 17/850 2024-06-12 19:55 by Lynn212
信息提示
请填处理意见