%读取图片
function []=cfar(F,F1)
tic;
%F=imread('123.tif');
disp(['CFAR检测开始']);
%F=rgb2gray(F);
%F1=imread('海岸线检测后二值图像.tif');
F1=uint8(F1);
F2=F.*F1;
%F2=F;
%建立三个窗口并初始化,设三个窗口的宽度分别为Lengthi,Lengthp,Lengthb。
%对它们赋值为空,以进行初始化。
%zeros(m,n) : 返回一个m*n的零矩阵
%Lengthi=input('Lengthi=');
%Lengthp=input('Lengthp=');
%Lengthb=input('Lengthb=');
Lengthi=1;
Lengthp=11;
Lengthb=15;
IArray=zeros(Lengthi,Lengthi); %目标窗口
PArray=zeros(Lengthp,Lengthp); %保护窗口
BArray=zeros(Lengthb,Lengthb); %背景窗口
%把背景窗口中需要用到的像素点汇集到一个矩阵当中,这样可以直接对矩阵进行均值和方差的运算
%定义四个零矩阵A,B,C,D,代表把背景窗口中需要计算的像素点分成了四个矩阵,通过矩阵的转置和合并来实现对背景像素点的汇总
A=zeros((Lengthb-Lengthp)/2,Lengthb);
B=zeros(Lengthp,(Lengthb-Lengthp)/2);
C=zeros(Lengthp,(Lengthb-Lengthp)/2);
D=zeros((Lengthb-Lengthp)/2,Lengthb);
ABCD=zeros((Lengthb-Lengthp)/2,2*(Lengthb+Lengthp));%表示合矩阵,所包含的像素点个数为A,B,C,D四个之和
%读取图片宽高
[hf,lf]=size(F2);
%对原图像进行边缘扩展,并把扩展的边缘的像素全部赋值为0,扩展部分的宽度为背景窗口宽度减去目标窗口宽度然后再取一半
%该处理能够使滑动窗口遍历完图像所有的像素点
%扩展之前的图像的尺寸为hf*lf,扩展过后的尺寸为he*le
he=hf+(Lengthb-Lengthi)/2+Lengthb;
le=lf+(Lengthb-Lengthi)/2+Lengthb;
EnlargeArray=zeros(he,le);
EnlargeArray((Lengthb-Lengthi)/2:(Lengthb-Lengthi)/2+hf-1,(Lengthb-Lengthi)/2:(Lengthb-Lengthi)/2+lf-1)=F2(1:hf,1:lf);
%窗口以目标窗口的大小滑动遍历完所有的像素点,给出检测结果,完成双参数CFAR检测并恢复图像尺寸
%其中通过不断给滑动的目标窗口赋值来实现窗口的滑动。
Step=1;
for i=1:Step:he-Lengthb-2
for j=1:Step:le-Lengthb-2
%从扩展窗口中截取与目标窗口大小相同的窗口赋值给目标窗口IArray,通过i与j来实现遍历
IArray(1:Lengthi,1:Lengthi)=EnlargeArray(i+(Lengthb-Lengthi)/2:i+(Lengthb+Lengthi)/2-1,j+(Lengthb-Lengthi)/2:j+(Lengthb+Lengthi)/2-1);
%mean(A):如果A是一个矩阵,mean(A)将其中各列视为向量,返回一个包含所有列向量平均值的行向量
%x(:)表示将矩阵所有的数值写成一列组成一个列向量
%计算目标窗口的像素平均值
mu_t=mean(IArray(:));
%mu_t=log(mu_t1);
BArray(1:Lengthb,1:Lengthb)=EnlargeArray(i:i+Lengthb-1,j:j+Lengthb-1);
A(1:(Lengthb-Lengthp)/2,1:Lengthb)=EnlargeArray(i:i+(Lengthb-Lengthp)/2-1,j:j+Lengthb-1);
B(1:Lengthp,1:(Lengthb-Lengthp)/2)=EnlargeArray(i+(Lengthb-Lengthp)/2:i+(Lengthb+Lengthp)/2-1,j:j+(Lengthb-Lengthp)/2-1);
C(1:Lengthp,1:(Lengthb-Lengthp)/2)=EnlargeArray(i+(Lengthb-Lengthp)/2:i+(Lengthb+Lengthp)/2-1,j+(Lengthb+Lengthp)/2:j+Lengthb-1);
D(1:(Lengthb-Lengthp)/2,1:Lengthb)=EnlargeArray(i+(Lengthb+Lengthp)/2:i+Lengthb-1,j:j+Lengthb-1);
ABCD=[A,B',C',D];%水平方向上拼接,B,C需要转置是因为宽高正好是A,B的高宽,矩阵ABCD即为背景窗口的合矩阵
% EFGH=log(ABCD);
%a和b的参数设置为下
%erf()为误差函数
%Pfa=input('Pfa=');
Pfa=1e-5;
t=erfinv(1-2*Pfa);
t1=2^(0.5)*t;
a=(exp(-t^2))/(((2*pi)^(0.5))*(0.5+0.5*erf(t)));
b=1-t1*(exp(-t^2))/(((2*pi)^(0.5))*(0.5+0.5*erf(t)));
%计算背景窗口像素的标准差
delta_b=std2(ABCD)/((b-a^2)^(0.5));
%mean2()计算背景窗口像素的平均值
mu_b1=mean2(ABCD);
mu_b=mu_b1+a*delta_b;
%(目标窗口灰度值-背景窗口像素均值)/背景窗口像素标准差
%与标称化因子之间的大小关系
%如果前者大,则为目标赋值1,否则为背景,赋值0
if(((mu_t-mu_b)/delta_b)>t1)
EnlargeArray(i:(i+Lengthi-1),j:(j+Lengthi-1))=1;
else
EnlargeArray(i:(i+Lengthi-1),j:(j+Lengthi-1))=0;
end
end
end
P=EnlargeArray(1:hf,1:lf);
Q=padarray(P,[1,1],'symmetric','both');%边缘镜像补充
figure(5),imshow(Q),title('cfar检测后的二值图像');
%morphological_processing(Q);
imwrite(Q,'./result/cfar检测后的二值图像.tif');
toc;
disp(['CFAR检测完成']);
- 1
- 2
前往页