分水岭渐变填色程序

基于某篇文章的内容,我试图将原本建立在voronoi图划分上的程序改变成基于分水岭划分的程序。这一步我已经做到了。在此基础上,我需要实现几个目标:

之前的填色是三种面密度的,人为对面密度进行划分,且划分生硬,不具有指示意义面密度的概念没有面密度讨论这篇讲的更有价值。他的工作实现了对密集区域和分散区域的划分,可以人为现实密集的区域和分散的区域

我的填色工作从某种程度上实现了这个功能。

在画面积的时候,使用的是polyarea()函数。针对bwboundaries()函数对划分的统计,在matlab手册里这个函数分析的特别好。

for k=2:length(B) boundary=B{k}; Area(k)=polyarea(boundary(:,2),boundary(:,1)); D_Area(k)=1/Area(k); end
B是所有边界点的信息。B是一个Px1的cell。P代表边界的个数,而每一个cell里面,是nx2的矩阵。n是每一个边界的组成的点的数目,n(:,2)为Y坐标,n(:,1)为X坐标。

填色的程序:

填色一般用fill和patch。都是建立在坐标基础上的区域填色,有封闭区域的坐标才能填色。填色实际上就是colormap()函数。色图有很多种类,比如jet、winter、summer,每一个色图都是一组处于0和1之间的数。设定颜色实际上是一种rgb三色的调整方法。分布赋给r、g、b三个变量一系列值,然后再patch函数后面加上rgb三色的信息。

row_cmap=2820;
clmap=zeros(rowcmap,3);
cr=0:1/(rowcmap-1):1;
cr=fliplr(cr);
cg=0:1/(rowcmap-1):1;
% cg=fliplr(cg);
cb=0:1/(rowcmap-1):1;
patch(x,y,[r g b]);

区域密度排序:

sort()函数是一个排序函数,[A id]=sort(xx)。sort()是顺序排序,即从小到大排列。id是重新排列后的这些元素的原来的下标索引,有这个就可以回溯到原来的矩阵中。

该程序在row_cmap部分设定时,如果设定值较小,则可以把密度较高的区域显示出来,而不显示密度较低(即面积较大)的区域。[1 0 0]是红色,[0 0 1]是蓝色。fliplr()函数是行向量的倒序排列,flipld()是列向量的倒序排列。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注