資源簡介
在MATLAB中實現高光譜異常檢測KRX算法,主要是參靠KRX英文原文《Kernel RX-Algorithm: A Nonlinear Anomaly Detector for Hyperspectral Imagery》實現。
代碼片段和文件信息
function?result=KRX(imagewinlenthtargetShape)
%image?輸入3維高光譜圖像
%winlenth?局部窗口大小
%targetShape??目標形狀
%result?檢測結果
switch?targetShape%目標形狀
case?0
target_spatial=...
????[0?0?1?0?0;
????0?0?1?0?0;
????1?1?1?1?1;
????0?0?1?0?0;
????0?0?1?0?0];
case?1
target_spatial=...
????[1?1?1;
????1?1?1;
????1?1?1];
case?2?
target_spatial=...
????[1?0?0?0?1;?
????0?1?0?1?0;
????0?0?1?0?0;
????0?1?0?1?0;
????1?0?0?0?1];
case?3
target_spatial=...
????[1?0?0?0?0?0?1;
????0?1?0?0?0?1?0;
????0?0?1?0?1?0?0;
????0?0?0?1?0?0?0;
????0?0?1?0?1?0?0;
????0?1?0?0?0?1?0;
????1?0?0?0?0?0?1];
otherwise
disp(‘Unknown?shape.‘)
end
sizeTarget=size(target_spatial);
%?若為二維圖象,將其看作一幅第三維為1的三維圖象
SizeA=size(image);
if?length(SizeA)==2?
SizeA(3)?=?1;
end
%?若為二維圖象,將其看作一幅第三維為1的三維圖象
SizeA=size(image);
if?length(SizeA)==2?
SizeA(3)?=?1;
end
%將image擴充為imageExpand
imageExpand((winlenth+1)/2:(winlenth-1)/2+SizeA(1)?(winlenth+1)/2:(winlenth-1)/2+SizeA(2):)=image;?%中
imageExpand((winlenth-1)/2:-1:1(winlenth+1)/2:(winlenth-1)/2+SizeA(2):)=image(1:(winlenth-1)/2::);?%上
imageExpand(winlenth-1+SizeA(1):-1:(winlenth+1)/2+SizeA(1)(winlenth+1)/2:(winlenth-1)/2+SizeA(2):)...%下
=image(SizeA(1)-(winlenth-3)/2:SizeA(1)::);?%
imageExpand((winlenth+1)/2:(winlenth-1)/2+SizeA(1)(winlenth-1)/2:-1:1:)=image(:1:(winlenth-1)/2:);?%左
imageExpand((winlenth+1)/2:(winlenth-1)/2+SizeA(1)winlenth-1+SizeA(2):-1:(winlenth+1)/2+SizeA(2):)...%右
=image(:SizeA(2)-(winlenth-3)/2:SizeA(2):);?%
imageExpand((winlenth-1)/2:-1:1(winlenth-1)/2:-1:1:)=image(1:(winlenth-1)/21:(winlenth-1)/2:);?%左上
imageExpand(winlenth-1+SizeA(1):-1:(winlenth+1)/2+SizeA(1)winlenth-1+SizeA(2):-1:(winlenth+1)/2+...?%右下
SizeA(2):)=image(SizeA(1)-(winlenth-3)/2:SizeA(1)SizeA(2)-(winlenth-3)/2:SizeA(2):);?%
imageExpand(winlenth-1+SizeA(1):-1:(winlenth+1)/2+SizeA(1)(winlenth-1)/2:-1:1:)...?%左下
=image(SizeA(1)-(winlenth-3)/2:SizeA(1)1:(winlenth-1)/2:);?%
imageExpand((winlenth-1)/2:-1:1winlenth-1+SizeA(2):-1:(winlenth+1)/2+SizeA(2):)...?%右上
=image(1:(winlenth-1)/2SizeA(2)-(winlenth-3)/2:SizeA(2):);?%
clear?image;
spatial_pattern=zeros(winlenthwinlenth);%winlenth應該是窗口大小
targetSize=size(target_spatial);
result=zeros(SizeA(1)SizeA(2));
for?i=1:targetSize(1)
????for?j=1:targetSize(2)
????????spatial_pattern((winlenth-targetSize(1))/2+i(winlenth-targetSize(1))/2+j)=1;
????end
end
s=zeros(1winlenth*winlenth);
????k=1;
for?i=1:winlenth
for?j=1:winlenth
%?s((i-1)*winlenth+j)=spatial_pattern(
評論
共有 條評論