MATLAB 四叉树分割遥感图像
四叉树是遥感图像处理里面常用的一种算法,我这里采用递归的方法来实现
数据处理的思路
对于图像矩阵,我是判断它的方差是否小于某个阈值,大于就继续分,小于就不分。
不分之后的处理就是,计算矩阵的平均值,然后把平均值赋给矩阵所有的元素。
算法流程图如下:
源代码
Nan_mean函数
用来计算矩阵平均值
function [m] = Nan_mean(x)
%Nan_mean 此处显示有关此函数的摘要
% 此处显示详细说明
x = x(:);
k = 1;
x0 = [];
for j = 1:length(x)
if ( ~isnan(x(j)) )
x0(k) = x(j);
k = k+1;
end
end
% && length(x0) > length(x)/2
if (~isempty(x0) && length(x0)/length(x) > 0.15)
m = mean(x0)
else
m = mean(x);
end
myvar函数
用来计算矩阵的方差
function [ re ] = myvar( x )
%MYVAR 此处显示有关此函数的摘要
% 此处显示详细说明
x = x(:);
num = sum(~isnan(x));
m = Nan_mean(x);
if (num == 0)
re = 0;
else
re = 0;
for i = 1:length(x)
if (~isnan(x(i)))
re = re+(x(i)-m)^2;
end
end
re = re / num;
end
end
FTree_tra函数
递归四叉树分割函数
function [p] = FTree_tra(x,min)
%FTree_tra 此处显示有关此函数的摘要
% 此处显示详细说明
p = x;
if (length(p) > 0)
yp = length(p(:,1));
xp = length(p(1,:));
xp0 = xp/2;
yp0 = yp/2;
child1 = p([1:yp0],[1:xp0]);
child2 = p([1:yp0],[xp0+1:xp0*2]);
child3 = p([yp0+1:yp0*2],[1:xp0]);
child4 = p([yp0+1:yp0*2],[xp0+1:xp0*2]);
v = myvar(p);
if ((v > 0.005 ) && yp>min)
child1 = FTree_tra(child1,min);
child2 = FTree_tra(child2,min);
child3 = FTree_tra(child3,min);
child4 = FTree_tra(child4,min);
p = [child1 child2;
child3 child4];
else
if (Nan_mean(p) ~= 1 && length(p) > 0)
p = ones(yp,xp).*Nan_mean(p);
p(1:end,1,:)=nan; %直接修改所有block的左、上边界为白色。
p(1,1:end,:)=nan;
flag2 = Nan_mean(p);
end
end
end
end
参考结果
存在的问题
可以看到在图像边缘部分,会出现一些较大的图块,这是因为计算图像边缘的时候,Nan_mean函数里头的
if (~isempty(x0) && length(x0)/length(x) > 0.15)
0.15这个阈值可能不是很合适,可能要调小一点吧。
欢迎大家留言交流!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)