| 查看: 1567 | 回复: 2 | ||||
[交流]
【求助】帮忙看下这四个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,:) 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 % title('Gray Pixels Found by Robust AWB'),xlabel('Pixels in their original color are considered gray') totGray = [totGray sum(F disp('No valid gray pixels found.') break end grays = im(:,F 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 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) %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) % 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 |
» 猜你喜欢
计算机、0854电子信息(085401-058412)调剂
已经有5人回复
国自然申请面上模板最新2026版出了吗?
已经有13人回复
基金委咋了?2026年的指南还没有出来?
已经有3人回复
Materials Today Chemistry审稿周期
已经有5人回复
溴的反应液脱色
已经有7人回复
推荐一本书
已经有12人回复
基金申报
已经有4人回复
纳米粒子粒径的测量
已经有7人回复
常年博士招收(双一流,工科)
已经有4人回复
有没有人能给点建议
已经有5人回复
» 本主题相关价值贴推荐,对您同样有帮助:
用matlab求解方程出问题,请帮忙看看
已经有3人回复
matlab编程(第二版)---菜鸟入门教程
已经有515人回复
MATLAB经典算法程序
已经有531人回复
帮忙看一段matlab 程序
已经有4人回复
帮忙看看这个平面图用matlab怎么画
已经有19人回复
一个关于matlab的遗传算法的问题
已经有3人回复
新手求助Matlab求解系数
已经有10人回复
求助高手帮忙用matlab接下面这个算式,具体见附件
已经有5人回复
初写论文菜鸟,大家帮忙看一下这几张图是用什么软件画的或生成的?
已经有10人回复
【求助】菜鸟求助 matlab 绘图问题 绘制光谱图
已经有3人回复
【求助】请教一个matlab程序,谢谢帮忙!!
已经有15人回复
【求助】matlab 算法求教
已经有4人回复
2楼2011-02-27 09:50:16
lhfx_313
至尊木虫 (文坛精英)
- 应助: 1 (幼儿园)
- 贵宾: 0.155
- 金币: 29747.1
- 散金: 2852
- 红花: 20
- 沙发: 102
- 帖子: 11130
- 在线: 1568.7小时
- 虫号: 550265
- 注册: 2008-04-23
- 专业: 通信理论与系统
3楼2011-02-27 11:47:23











回复此楼