在计算两幅图像像元水平上的相关性时,由于图像的分辨率高,导致直接画散点图根本就体现不出来大致的趋势,因此需要用密度散点图来进行刻画。散点密度图的核心是在x和y的范围内找到在这个范围内的点的数量,需要合理选择x和y的区间。
首先本文这里以两幅ET的数据作为样例,分辨率为1000m,值的区间再8到1100,两者的最大差距不超过800,选择以5作为两幅图像的间隔,提取如下代码
% author yinlichang3064@163.com
filemean='I:\蒸散发\各ET的均值和趋势\yr_SSEB_2003-2013年ET的均值.tif';
sseb=importdata(filemean);
filemean='I:\蒸散发\各ET的均值和趋势\yr_SSEBopYRB_2003-2013年ET的均值.tif';
ssebop=importdata(filemean);
sy1=find(sseb>0 & ssebop>0); %找到两者的有效值
sseb_1=double(sseb(sy1));
ssebop_1=double(ssebop(sy1));
valuesum=zeros(47961,3); %以47961是因为8:5:1100的长度为219,219的平方为47961
k=1;
for i=8:5:1100 %sseb
sy=find(sseb_1>=i & sseb_1<i+5);
j1=i+800;
j2=i-800;
if j1>1100
j1=1100;
end
if j2<8
j2=8;
end
for j=j2:5:j1 %ssebop
sy2= find(ssebop_1>=j & ssebop_1<j+5);
sy3=intersect(sy,sy2);
cd=length(sy3);
if length(cd)>0
value=[i,j,cd];
valuesum(k,:)=value;
end
k=k+1;
end
end
通过上述代码就可以得到valuesum变量,该变量中第一列存储的是sseb的值,第二列是ssebop的值,第三列是两幅图像处于这个区间的值的数量。通过scatter函数即可以画出散点密度图,但较为粗糙,需要对图像进行修饰,采用如下代码
author yinlichang3064@163.com
set(gcf,'Units','centimeters','Position',[6 6 14 13]); %设置图像位置和大小
valuesum_sseb=valuesum(valuesum(:,3)>0,:);
scatter(valuesum_sseb(:,1),valuesum_sseb(:,2),[],valuesum_sseb(:,3),'.')
set(gca,'Xlim',[0,1100],'Ylim',[0,1100],'XTick',[0:300:1100],'YTick',[0:300:1100])
ylabel('ET_S_S_E_B_o_p_Y_R_B','Fontname', 'Times New Roman','FontSize',12); %下标
hold on
h1=refline(1,0) %辅助1:1线
h2=refline(0.3428,284.4) %拟合线获取
set(h1,'color','black','linewidth',1.5)
set(h2,'color','red','linewidth',1.5)
text(100,1000,'R^2=0.51')
text(100,900,'N=798125')
text(800,100,'ET_S_S_E_B_o_p_G_l_o')
运行效果如下图所示
sseb.jpg
想输出高分辨图像,采用文件-导出设置,在该对话框中采用渲染工具,并设置分辨率为600,然后导出为jpg格式即可,单个图像的话可以增加colorbar,具体设置如下,直接在最后一行加上这句
colorbar([0.91 0.11 0.03 0.81])
颜色表征了数量的多少,红色表示拟合线,黑色表示1:1的线下图是用另外数据同样流程制作的。
example.jpg
网友评论