渐晕效应,是指图像整体出现中部较亮而四周较黑的一种现象(这是我的理解,详细的解释和定义请参考百度百科或搜狗百科的相关内容),由于刚刚接触这个领域,有些不专业的部分请大佬指证。
初次尝试对遥感拼接图像做渐晕校正,由于源图像拼接质量不错,获取的图像看起来只有渐晕的问题。有参考网上的一些文献,有要求使用同样的成像设备,拍摄一张同等尺寸的白色背景图像用于校正,但是我所获取的图像来自于厂家已经拍摄好的图像,手头上没有设备,所以这一步走不通,后面我尝试着对图像的行列分别取像素然后做拟合,再构成评估矩阵,即通过图像行列像素的拟合代替拍摄的校正图像,后面还要将用同形的单位矩阵对评估矩阵做减操作获得最终的权重矩阵,已达到对图像的补偿作用。最后利用权重矩阵和原图像做线性加权。程序还有许多问题,由于在评估矩阵的两个分量合成的时候 只是简单的相加操作使得其图像质量不是太好,或许做过平滑处理后,效果会好点。渣渣初次上传代码,有许多问题还请各位大佬指证。程序调试的时候,请注意设置一下matlab环境的当前路径
clear all; close all; clc; tic; load 1.mat; [n,m]=size(im1); figure;imshow(im1);title('原始图像'); %%%%水平方向逐列取像素点,做多项式平滑后构建出评估矩阵的垂直分量%%%%% x=1:1:n; co_mat=zeros(n,m); JDT=waitbar(0,'im1 polyfiting...','name','pixel polffing'); for k=1:1:m y=im1(:,k); y=y'; pixelpolyfit=polyfit(x,y,2); polyoutput=polyval(pixelpolyfit,x); co_mat(1:n,k)=polyoutput'; prosess=k/m; show_string=strcat(num2str(prosess*100),'%'); waitbar(prosess,JDT,show_string); end delete(JDT); co_im=mat2gray(co_mat); figure;imshow(co_im);title('水平分量'); %%%%%%对图像做垂直方向逐行取像素,做多项式平滑构成评估矩阵图像的水平分量%% JDT=waitbar(0,'im1 polyfiting...','name','pixel polffing'); co_mat1=zeros(n,m); x1=1:1:m; for k=1:1:n y2=im1(k,:); pixelpolyfit=polyfit(x1,y2,3); polyoutput=polyval(pixelpolyfit,x1); co_mat1(k,:)=polyoutput'; prosess=k/n; show_string=strcat(num2str(prosess*100),'%'); waitbar(prosess,JDT,show_string); end delete(JDT); co_im=mat2gray(co_mat1); figure;imshow(co_im);title('垂直分量'); %%%将评估矩阵的水平和垂直向量相加,并用同形的单位阵相减得到评估矩阵val_mat co_im3=co_mat1+co_mat; val_mat=ones(n,m)-co_im3; %使用val_mat矩阵中的数值作为权重对图像做线性加权 im2=4*(im1.*val_mat); %对处理后的图像X4做灰度变换使得其观感变得较好 figure;imshow(im2);title('渐晕校正之后'); %%%%%%%%程序运行计时使用%%%%%%%%% time=toc; time_used=time; time_string=strcat(num2str(time_used),'s'); display(time_string);
clear all;
close all;
clc;
tic;
load 1.mat;
[n,m]=size(im1);
figure;imshow(im1);title('原始图像');
%%%%水平方向逐列取像素点,做多项式平滑后构建出评估矩阵的垂直分量%%%%%
x=1:1:n;
co_mat=zeros(n,m);
JDT=waitbar(0,'im1 polyfiting...','name','pixel polffing');
for k=1:1:m
y=im1(:,k);
y=y';
pixelpolyfit=polyfit(x,y,2);
polyoutput=polyval(pixelpolyfit,x);
co_mat(1:n,k)=polyoutput';
prosess=k/m;
show_string=strcat(num2str(prosess*100),'%');
waitbar(prosess,JDT,show_string);
end
delete(JDT);
co_im=mat2gray(co_mat);
figure;imshow(co_im);title('水平分量');
%%%%%%对图像做垂直方向逐行取像素,做多项式平滑构成评估矩阵图像的水平分量%%
JDT=waitbar(0,'im1 polyfiting...','name','pixel polffing');
co_mat1=zeros(n,m);
x1=1:1:m;
for k=1:1:n
y2=im1(k,:);
pixelpolyfit=polyfit(x1,y2,3);
polyoutput=polyval(pixelpolyfit,x1);
co_mat1(k,:)=polyoutput';
prosess=k/n;
show_string=strcat(num2str(prosess*100),'%');
waitbar(prosess,JDT,show_string);
end
delete(JDT);
co_im=mat2gray(co_mat1);
figure;imshow(co_im);title('垂直分量');
%%%将评估矩阵的水平和垂直向量相加,并用同形的单位阵相减得到评估矩阵val_mat
co_im3=co_mat1+co_mat;
val_mat=ones(n,m)-co_im3; %使用val_mat矩阵中的数值作为权重对图像做线性加权
im2=4*(im1.*val_mat); %对处理后的图像X4做灰度变换使得其观感变得较好
figure;imshow(im2);title('渐晕校正之后');
%%%%%%%%程序运行计时使用%%%%%%%%%
time=toc;
time_used=time;
time_string=strcat(num2str(time_used),'s');
display(time_string);