红外弱小目标检测:MPCM算法解读及MATLAB复现

参考文献:[1]   Y. Wei, X. You, and H. Li, “Multiscale patch-based contrast measure for small infrared target detection,” Pattern Recognit., vol. 58, pp. 216–226, 2016.

本文是对上述文献中的Multiscale patch-based contrast method, MPCM 算法的详细解析与MATLAB复现,并给出实验结果。


一、作者为什么提出MPCM算法

1.1. 研究现状

本文的算法是基于人类视觉系统(human visual system,HVS)提出的。

补充:人类视觉系统 

红外弱小目标领域,应用人类视觉亮度对比度机制的重点在于:增强目标与背景的对比度(即增强目标、抑制背景)。基于此,有很多相关论文(LCM,ILCM......)

本文提到当前基于人类视觉对比度机制的算法仍存在缺陷:

算法缺陷
Average gray absolute difference maximum map, AGADMM不能很好地抑制背景
Local Contrast Method, LCM 

只能检测亮目标 

Improved Local Contrast Method, ILCM

会平滑目标

Accumulated Center-surround Difference Measure, ACSDM可以检测强噪声背景下的弱目标,但耗时

基于上述研究现状,本文提出了MPCM算法计算目标的对比度,并给予MPCM算法得到的显著性对比度图Contrast Map结合阈值分割进行目标检测。

1.2. 本文算法创新点

本文的贡献点主要体现在两个方面:

  1. 提出衡量目标局部对比度的MPCM算法,MPCM不仅可以增强目标,而且可以抑制背景;不仅能增强亮目标,也能增强暗目标;
  2. 算法的易于并行,在高检测率、低虚警率下具有较好的实时性。

二、相关工作:Local Contrast Method, LCM[2]

人类视觉对比度机制相关的最经典的算法就是LCM了,后续有很多在LCM算法上的延伸,LCM给出了计算目标的局部对比度的方法,很多相关论文与其思想是一致的,只是在计算方法上进行了相应的改进。

2.1 LCM算法原理

                                                                                      图1 目标区域与局部背景区域的定义[2]

LCM提出使用一个滑动窗口在图像上从左至右,从上至下逐像素滑动,如图1;每个窗口被划分为9(3*3)个子窗口,如图2,中间位置是目标可能出现的区域。

                                                                                     图2 滑动窗口的结构[2]

目标局部对比度的计算方法:

第一步:计算周围8个邻域的平均像素值

                          m_i=\frac{ 1}{N_u}\sum_{j=1}^{N_u}I_j^i    ………………………… (1)  式中,N_u表示子窗口中包含的像素数量,I_j^i表示第i个子窗口内的第j个像素的像素值

第二步:计算局部对比度

中心子窗口与其邻域窗口的对比度可表示为:c_i=\frac{L_0}{m_i}  ……………………(2)  式中,L_0表示中心子窗口的像素最大值

第三步:计算LCM

LCM算法提出的假设:目标的灰度比邻域高 (Target is brighter than that of their neighborhoods)

C=\min_iL_0\times c_i = \min_iL_0 \times \frac{L0}{m_i} = \min_i\frac{L_0^2}{m_i}      ………………………………(3)

      即 C = \frac{L_0^2}{ \max_i \{m_i\}}

C的值越大,中心区域是目标的可能性越大,分析如下:

  • 如果中心区域是目标,则\frac{L_0}{ m_i}>1,进而C = L_0\times \frac{L_0}{ m_i}>L_0
  • 如果中心区域不是目标,则\frac{L_0}{ m_i}\leq 1,进而C=L_0\times \frac{L_0}{ m_i} \leq L_0

由此,目标区域像素值得到增强,背景得到抑制;但是该算法的缺点是:

  • 容易受高亮点噪声的干扰,这一点在论文[3]中得到了改进;
  • 滑动窗口逐像素移动,算法时间实时性差,这一点在论文[4]中得到了改进。

三、Multiscale patch-based contrast measure, MPCM[1]

算法分为两部分:(1)目标增强;(2)阈值分割

 3.1 PCM算法介绍

                                                                                  图3 滑动窗口的结构[1]

滑动窗口被分为两部分(与LCM算法一致),将背景分为8部分,该步骤的操作目的是为了增强目标并一致背景。

目标子窗口与背景之间的区别定义为:

D(T)=\begin{pmatrix} d(T,B1)\\ d(T,B2)\\ ...\\ d(T,B8) \end{pmatrix}    ………………………… (4),其中d表示目标与背景的差异程度。

d的计算方式有多种,本文选择的是均值作差,即d(T,Bi)=m_T-m_B_i, \quad (i=1,2,...,8),其中m_T, m_B_i分别为目标区域与背景子区域的像素均值。

公式(4)给出了某一尺度下局部对比度的度量方法,基于目标与背景的灰度差异,进一步提出:

\widetilde{d_i}=d(T,B_i)*d(T,B_{i+4}), \quad(i=1,2,...,4)    …………………… (5)

\widetilde{d_i}表示了中心区域与周围邻域在不同方向上的灰度差异,如果\widetilde{d_i}>0,则表示中心区域与邻域的差异是一致的,要么比中心区域亮,要么比中心区域暗,因此可以衡量目标区域的特征。

目标与背景之间的对比度越大越好,因此本文定义某一尺度下目标的对比度测量方式pathc-based contrast measure(PCM)为:

C(x_{ii},y_{jj})=\min_{i=1,2,3,4} \widetilde{d_i}  …………………………(6) 式中,(x_{ii},y_{jj})表示目标区域的中心位置的坐标。

结合PCM计算公式,计算显著性对比度图的Algorithm1 步骤

  1. 计算目标区域的均值;
  2. 计算8邻域背景的均值;
  3. 结合公式(6)计算局部对比度;
  4. 滑动窗口遍历整幅图像,直到遍历完整幅图,输出显著性对比度图C。

在实践中,上述步骤可以采用滤波操作进行实现:

  1. 第一步:整幅图可以采用N*N大小的均值滤波器进行均值滤波,得到图像f_0
  2. 第二步:可以使用8个图4所示滤波器对f_0进行滤波处理,得到图像F_i,i=1,2,3,4,5,6,7,8;
  3. 第三步:根据公式(5)计算得到局部对比度\widetilde{d_i}
  4. 第四步:根据公式(6)计算得到PCM。

                                                                     图4 滤波器结构,其中选定N=3,每个滤波器中大小为9*9,还有79个0,两个非0元素

3.2 MPCM实现

在实际应用中,目标大小是不能被提前预估的。

检测窗口的大小应当接近目标的大小。

算法步骤:

  1. 计算多个尺度下的局部对比度图C^l,其中l表示子窗口的不同尺度,可根据实验数据提前预估并拟定;
  2. 遍历对比度图中的每个像素位置,计算MPCM,计算公式为:\widehat{C_{p,q}}=\max_{l=1,2,...L} C^l(p,q),其中p,q分别表示列号与行号。

本文中,对子窗口的大小N的选取是重点,如果窗口选取的太小,目标会被标记为背景,目标选取过大会增加计算量。

但本文假设目标的大小不会超过81个像素,N的大小不超过9.

3.3 阈值分割

其中,\mu表示MPCM得到的显著图的均值,\delta表示MPCM得到的显著图的标准差,K是经验值,取值3~14.

四、算法讨论

本文的Discussion部分介绍了算法的灵活性,并从数学原理上分析算法的可行性。用到的数学知识并不难!

4.1 关于亮、暗目标的检测

上述公式可根据检测的目标类型被重写为:

在亮暗目标混杂的图像序列中,使用公式(6);如果只需检测亮目标,用公式(12);如果只需检测暗目标,用公式(13)

4.2 数学分析说明PCM算法如何增强目标并抑制背景

首先,均值滤波可以消除一定的噪声;

其次,公式(16)表明,T越大,对比度的值增长越快;所以如果T代表目标,则局部对比度值较大;如果T代表背景,对比度接近0;由此证明本文算法可以增强目标并抑制背景。

五、MATLAB复现

5.1 以N=3 为例,求PCM

复现公式(4)(5)(6)

第一步:计算目标区域的均值,使用N*N大小的均值滤波器遍历整幅图,得到滤波后的图像f_0;

function mean=localmean(f,nhood)
%% 函数功能:均值滤波器遍历整幅图像,求目标区域的均值
if nargin==1
    nhood = fspecial('average', 3);
else
    nhood=nhood/(sum(nhood(:)));
end

mean=imfilter(f,nhood,'replicate');

第二步:构造图4所示滤波器,并对f_0进行滤波处理,得到图像F_i,i=1,2,3,4,5,6,7,8;

    m31 = zeros(9,9);
    m32 = zeros(9,9);
    m33 = zeros(9,9);
    m34 = zeros(9,9);
    m35 = zeros(9,9);
    m36 = zeros(9,9);
    m37 = zeros(9,9);
    m38 = zeros(9,9);
    m31(2,2) = -1; m31(5,5) = 1;
    m32(2,5) = -1; m32(5,5) = 1;
    m33(2,8) = -1; m33(5,5) = 1;
    m34(5,2) = -1; m34(5,5) = 1;
    m35(5,8) = -1; m35(5,5) = 1;
    m36(8,2) = -1; m36(5,5) = 1;
    m37(8,5) = -1; m37(5,5) = 1;
    m38(8,8) = -1; m38(5,5) = 1;
    
    PCM3 = zeros(row, col, 8);
    % 这里l3为使用N=3大小的均值滤波模板得到的滤波图像
    PCM3(:,:,1) = imfilter(l3, m31, 'replicate');  
    PCM3(:,:,2) = imfilter(l3, m32, 'replicate');
    PCM3(:,:,3) = imfilter(l3, m33, 'replicate');
    PCM3(:,:,4) = imfilter(l3, m34, 'replicate');
    PCM3(:,:,5) = imfilter(l3, m35, 'replicate');
    PCM3(:,:,6) = imfilter(l3, m36, 'replicate');
    PCM3(:,:,7) = imfilter(l3, m37, 'replicate');
    PCM3(:,:,8) = imfilter(l3, m38, 'replicate');

第三步:根据公式(5)计算得到局部对比度\widetilde{d_i}

    temp3 = zeros(row, col, 4);
    temp3(:,:,1) = PCM3(:,:,1) .* PCM3(:,:,5);
    temp3(:,:,2) = PCM3(:,:,2) .* PCM3(:,:,6);
    temp3(:,:,3) = PCM3(:,:,3) .* PCM3(:,:,7);
    temp3(:,:,4) = PCM3(:,:,4) .* PCM3(:,:,8);
    out3 = min(temp3, [], 3);

第四步: 根据公式(6)计算得到PCM。

    temp3 = zeros(row, col, 4);
    temp3(:,:,1) = PCM3(:,:,1) .* PCM3(:,:,5);
    temp3(:,:,2) = PCM3(:,:,2) .* PCM3(:,:,6);
    temp3(:,:,3) = PCM3(:,:,3) .* PCM3(:,:,7);
    temp3(:,:,4) = PCM3(:,:,4) .* PCM3(:,:,8);
    out3 = min(temp3, [], 3);

5.2 MPCM 算法MATLAB实现

这里给出两种实现方式,一种是按照LCM的算法实现方式,分别去构造滤波器,另一种则是按照本文给出的方式,使用均值滤波器并构造图4中的滤波器。

方式一

function  out  = MPCM_fun( img )
% this function computes multiscale patch-based contrast measure (MPCM)
% the output image is acheieved using max selection through third dimension

%% inputs:
% img: the input image

%% output
% out: output filtered image
%%
[row,col]=size(img);

% 创建N = 3,5,7,9的模板
mask3=ones(3);
mask5=ones(5);
mask7=ones(7);
mask9=ones(9);

% 求均值,得到mT, mBi
%% 第一步:计算目标区域的均值
l3=localmean(img,mask3);
l5=localmean(img,mask5);
l7=localmean(img,mask7);
l9=localmean(img,mask9);

m31=zeros(9);
m32=zeros(9);
m33=zeros(9);
m34=zeros(9);
m35=zeros(9);
m36=zeros(9);
m37=zeros(9);
m38=zeros(9);
m31(1:3,1:3)=1;
m32(1:3,4:6)=1;
m33(1:3,7:9)=1;
m34(4:6,7:9)=1;
m35(7:9,7:9)=1;
m36(7:9,4:6)=1;
m37(7:9,1:3)=1;
m38(4:6,1:3)=1;

%% 第二步:计算8邻域均值
LCM3=zeros(row,col,8);
LCM3(:,:,1)=localmean(img,m31);
LCM3(:,:,2)=localmean(img,m32);
LCM3(:,:,3)=localmean(img,m33);
LCM3(:,:,4)=localmean(img,m34);
LCM3(:,:,5)=localmean(img,m35);
LCM3(:,:,6)=localmean(img,m36);
LCM3(:,:,7)=localmean(img,m37);
LCM3(:,:,8)=localmean(img,m38);

F31=l3-reshape(LCM3(:,:,1),row,col);
F32=l3-reshape(LCM3(:,:,2),row,col);
F33=l3-reshape(LCM3(:,:,3),row,col);
F34=l3-reshape(LCM3(:,:,4),row,col);
F35=l3-reshape(LCM3(:,:,5),row,col);
F36=l3-reshape(LCM3(:,:,6),row,col);
F37=l3-reshape(LCM3(:,:,7),row,col);
F38=l3-reshape(LCM3(:,:,8),row,col);

temp3=zeros(row,col,4);

temp3(:,:,1)=F31.*F35;
temp3(:,:,2)=F32.*F36;
temp3(:,:,3)=F33.*F37;
temp3(:,:,4)=F34.*F38;

out3=min(temp3,[],3);




m51=zeros(15);
m52=zeros(15);
m53=zeros(15);
m54=zeros(15);
m55=zeros(15);
m56=zeros(15);
m57=zeros(15);
m58=zeros(15);
m51(1:5,1:5)=1;
m52(1:5,6:10)=1;
m53(1:5,11:15)=1;
m54(6:10,11:15)=1;
m55(11:15,11:15)=1;
m56(11:15,6:10)=1;
m57(11:15,1:5)=1;
m58(6:10,1:5)=1;


LCM5=zeros(row,col,8);
LCM5(:,:,1)=localmean(img,m51);
LCM5(:,:,2)=localmean(img,m52);
LCM5(:,:,3)=localmean(img,m53);
LCM5(:,:,4)=localmean(img,m54);
LCM5(:,:,5)=localmean(img,m55);
LCM5(:,:,6)=localmean(img,m56);
LCM5(:,:,7)=localmean(img,m57);
LCM5(:,:,8)=localmean(img,m58);


F51=l5-reshape(LCM5(:,:,1),row,col);
F52=l5-reshape(LCM5(:,:,2),row,col);
F53=l5-reshape(LCM5(:,:,3),row,col);
F54=l5-reshape(LCM5(:,:,4),row,col);
F55=l5-reshape(LCM5(:,:,5),row,col);
F56=l5-reshape(LCM5(:,:,6),row,col);
F57=l5-reshape(LCM5(:,:,7),row,col);
F58=l5-reshape(LCM5(:,:,8),row,col);

temp5=zeros(row,col,4);
temp5(:,:,1)=F51.*F55;
temp5(:,:,2)=F52.*F56;
temp5(:,:,3)=F53.*F57;
temp5(:,:,4)=F54.*F58;


out5=min(temp5,[],3);



m71=zeros(21);
m72=zeros(21);
m73=zeros(21);
m74=zeros(21);
m75=zeros(21);
m76=zeros(21);
m77=zeros(21);
m78=zeros(21);
m71(1:7,1:7)=1;
m72(1:7,8:14)=1;
m73(1:7,15:21)=1;
m74(8:14,15:21)=1;
m75(15:21,15:21)=1;
m76(15:21,8:14)=1;
m77(15:21,1:7)=1;
m78(8:14,1:7)=1;

LCM7=zeros(row,col,8);
LCM7(:,:,1)=localmean(img,m71);
LCM7(:,:,2)=localmean(img,m72);
LCM7(:,:,3)=localmean(img,m73);
LCM7(:,:,4)=localmean(img,m74);
LCM7(:,:,5)=localmean(img,m75);
LCM7(:,:,6)=localmean(img,m76);
LCM7(:,:,7)=localmean(img,m77);
LCM7(:,:,8)=localmean(img,m78);


F71=l7-reshape(LCM7(:,:,1),row,col);
F72=l7-reshape(LCM7(:,:,2),row,col);
F73=l7-reshape(LCM7(:,:,3),row,col);
F74=l7-reshape(LCM7(:,:,4),row,col);
F75=l7-reshape(LCM7(:,:,5),row,col);
F76=l7-reshape(LCM7(:,:,6),row,col);
F77=l7-reshape(LCM7(:,:,7),row,col);
F78=l7-reshape(LCM7(:,:,8),row,col);

temp7=zeros(row,col,4);
temp7(:,:,1)=F71.*F75;
temp7(:,:,2)=F72.*F76;
temp7(:,:,3)=F73.*F77;
temp7(:,:,4)=F74.*F78;


out7=min(temp7,[],3);


m91=zeros(27);
m92=zeros(27);
m93=zeros(27);
m94=zeros(27);
m95=zeros(27);
m96=zeros(27);
m97=zeros(27);
m98=zeros(27);
m91(1:9,1:9)=1;
m92(1:9,10:18)=1;
m93(1:9,19:27)=1;
m94(10:18,19:27)=1;
m95(19:27,19:27)=1;
m96(19:27,10:18)=1;
m97(19:27,1:9)=1;
m98(10:18,1:9)=1;

LCM9=zeros(row,col,8);
LCM9(:,:,1)=localmean(img,m91);
LCM9(:,:,2)=localmean(img,m92);
LCM9(:,:,3)=localmean(img,m93);
LCM9(:,:,4)=localmean(img,m94);
LCM9(:,:,5)=localmean(img,m95);
LCM9(:,:,6)=localmean(img,m96);
LCM9(:,:,7)=localmean(img,m97);
LCM9(:,:,8)=localmean(img,m98);


F91=l9-reshape(LCM9(:,:,1),row,col);
F92=l9-reshape(LCM9(:,:,2),row,col);
F93=l9-reshape(LCM9(:,:,3),row,col);
F94=l9-reshape(LCM9(:,:,4),row,col);
F95=l9-reshape(LCM9(:,:,5),row,col);
F96=l9-reshape(LCM9(:,:,6),row,col);
F97=l9-reshape(LCM9(:,:,7),row,col);
F98=l9-reshape(LCM9(:,:,8),row,col);

temp9=zeros(row,col,4);
temp9(:,:,1)=F91.*F95;
temp9(:,:,2)=F92.*F96;
temp9(:,:,3)=F93.*F97;
temp9(:,:,4)=F94.*F98;


out9=min(temp9,[],3);
temp=zeros(row,col,4);

temp(:,:,1)=out3;
temp(:,:,2)=out5;
temp(:,:,3)=out7;
temp(:,:,4)=out9;

out=max(temp,[],3);

end

方式二

function out = MPCM_fun_2(img)
%% 函数功能:重写MPCM算法,使用论文中提到的8个模板
    
    [row, col] = size(img);
    %% 创建N = 3,5,7,9的模板
    mask3=ones(3);
    mask5=ones(5);
    mask7=ones(7);
    mask9=ones(9);
    
    %% 第一步:使用均值滤波器遍历整幅图像,得到均值图像l
    l3 = localmean(img, mask3);
    l5 = localmean(img, mask5);
    l7 = localmean(img, mask7);
    l9 = localmean(img, mask9);
    
    %% 第二步:构造论文中提到的8个滤波器,并对均值图像进行滤波
    m31 = zeros(9,9);
    m32 = zeros(9,9);
    m33 = zeros(9,9);
    m34 = zeros(9,9);
    m35 = zeros(9,9);
    m36 = zeros(9,9);
    m37 = zeros(9,9);
    m38 = zeros(9,9);
    m31(2,2) = -1; m31(5,5) = 1;
    m32(2,5) = -1; m32(5,5) = 1;
    m33(2,8) = -1; m33(5,5) = 1;
    m34(5,2) = -1; m34(5,5) = 1;
    m35(5,8) = -1; m35(5,5) = 1;
    m36(8,2) = -1; m36(5,5) = 1;
    m37(8,5) = -1; m37(5,5) = 1;
    m38(8,8) = -1; m38(5,5) = 1;
    
    PCM3 = zeros(row, col, 8);
    PCM3(:,:,1) = imfilter(l3, m31, 'replicate');
    PCM3(:,:,2) = imfilter(l3, m32, 'replicate');
    PCM3(:,:,3) = imfilter(l3, m33, 'replicate');
    PCM3(:,:,4) = imfilter(l3, m34, 'replicate');
    PCM3(:,:,5) = imfilter(l3, m35, 'replicate');
    PCM3(:,:,6) = imfilter(l3, m36, 'replicate');
    PCM3(:,:,7) = imfilter(l3, m37, 'replicate');
    PCM3(:,:,8) = imfilter(l3, m38, 'replicate');
    
    temp3 = zeros(row, col, 4);
    temp3(:,:,1) = PCM3(:,:,1) .* PCM3(:,:,5);
    temp3(:,:,2) = PCM3(:,:,2) .* PCM3(:,:,6);
    temp3(:,:,3) = PCM3(:,:,3) .* PCM3(:,:,7);
    temp3(:,:,4) = PCM3(:,:,4) .* PCM3(:,:,8);
    out3 = min(temp3, [], 3);
    
    %% 构造不同大小的滤波器 
    % N = 5
    m51=zeros(15);
    m52=zeros(15);
    m53=zeros(15);
    m54=zeros(15);
    m55=zeros(15);
    m56=zeros(15);
    m57=zeros(15);
    m58=zeros(15);
    m51(3,3) = -1; m51(8,8) = 1;
    m52(3,8) = -1; m52(8,8) = 1;
    m53(3,13) = -1; m53(8,8) = 1;
    m54(8,3) = -1; m54(8,8) = 1;
    m55(8,13) = -1; m55(8,8) = 1;
    m56(13,3) = -1; m56(8,8) = 1;
    m57(13,8) = -1; m57(8,8) = 1;
    m58(13,13) = -1; m58(8,8) = 1;
    
    PCM5 = zeros(row, col, 8);
    PCM5(:,:,1) = imfilter(l5, m51, 'replicate');
    PCM5(:,:,2) = imfilter(l5, m52, 'replicate');
    PCM5(:,:,3) = imfilter(l5, m53, 'replicate');
    PCM5(:,:,4) = imfilter(l5, m54, 'replicate');
    PCM5(:,:,5) = imfilter(l5, m55, 'replicate');
    PCM5(:,:,6) = imfilter(l5, m56, 'replicate');
    PCM5(:,:,7) = imfilter(l5, m57, 'replicate');
    PCM5(:,:,8) = imfilter(l5, m58, 'replicate');
    
    temp5 = zeros(row, col, 4);
    temp5(:,:,1) = PCM5(:,:,1) .* PCM5(:,:,5);
    temp5(:,:,2) = PCM5(:,:,2) .* PCM5(:,:,6);
    temp5(:,:,3) = PCM5(:,:,3) .* PCM5(:,:,7);
    temp5(:,:,4) = PCM5(:,:,4) .* PCM5(:,:,8);
    out5 = min(temp5, [], 3);
    
    % N = 7;
    m71=zeros(21); 
    m72=zeros(21);
    m73=zeros(21);
    m74=zeros(21);
    m75=zeros(21);
    m76=zeros(21);
    m77=zeros(21);
    m78=zeros(21);
    m71(4,4)=-1; m71(11,11) = 1;
    m72(4,11)=-1;m72(11,11) = 1;
    m73(4,18)=-1;m73(11,11) = 1;
    m74(11,4)=-1;m74(11,11) = 1;
    m75(11,18)=-1;m75(11,11) = 1;
    m76(18,4)=-1;m76(11,11) = 1;
    m77(18,11)=-1;m77(11,11) = 1;
    m78(18,18)=-1;m78(11,11) = 1;
    
    PCM7 = zeros(row, col, 8);
    PCM7(:,:,1) = imfilter(l7, m71, 'replicate');
    PCM7(:,:,2) = imfilter(l7, m72, 'replicate');
    PCM7(:,:,3) = imfilter(l7, m73, 'replicate');
    PCM7(:,:,4) = imfilter(l7, m74, 'replicate');
    PCM7(:,:,5) = imfilter(l7, m75, 'replicate');
    PCM7(:,:,6) = imfilter(l7, m76, 'replicate');
    PCM7(:,:,7) = imfilter(l7, m77, 'replicate');
    PCM7(:,:,8) = imfilter(l7, m78, 'replicate');
    
    temp7 = zeros(row, col, 4);
    temp7(:,:,1) = PCM7(:,:,1) .* PCM7(:,:,5);
    temp7(:,:,2) = PCM7(:,:,2) .* PCM7(:,:,6);
    temp7(:,:,3) = PCM7(:,:,3) .* PCM7(:,:,7);
    temp7(:,:,4) = PCM7(:,:,4) .* PCM7(:,:,8);
    out7 = min(temp7, [], 3);
    
    % N = 9
    m91=zeros(27);
    m92=zeros(27);
    m93=zeros(27);
    m94=zeros(27);
    m95=zeros(27);
    m96=zeros(27);
    m97=zeros(27);
    m98=zeros(27);
    
    m91(5,5)=-1;m91(14,14)=1;
    m92(5,14)=-1;m92(14,14)=1;
    m93(5,23)=-1;m93(14,14)=1;
    m94(14,5)=-1;m94(14,14)=1;
    m95(14,23)=-1;m95(14,14)=1;
    m96(23,5)=-1;m96(14,14)=1;
    m97(23,14)=-1;m97(14,14)=1;
    m98(23,23)=-1;m98(14,14)=1;
    
    PCM9 = zeros(row, col, 8);
    PCM9(:,:,1) = imfilter(l9, m91, 'replicate');
    PCM9(:,:,2) = imfilter(l9, m92, 'replicate');
    PCM9(:,:,3) = imfilter(l9, m93, 'replicate');
    PCM9(:,:,4) = imfilter(l9, m94, 'replicate');
    PCM9(:,:,5) = imfilter(l9, m95, 'replicate');
    PCM9(:,:,6) = imfilter(l9, m96, 'replicate');
    PCM9(:,:,7) = imfilter(l9, m97, 'replicate');
    PCM9(:,:,8) = imfilter(l9, m98, 'replicate');
    
    temp9 = zeros(row, col, 4);
    temp9(:,:,1) = PCM9(:,:,1) .* PCM9(:,:,5);
    temp9(:,:,2) = PCM9(:,:,2) .* PCM9(:,:,6);
    temp9(:,:,3) = PCM9(:,:,3) .* PCM9(:,:,7);
    temp9(:,:,4) = PCM9(:,:,4) .* PCM9(:,:,8);
    out9 = min(temp9, [], 3);
    
    temp = zeros(row, col,4);
    temp(:,:,1)=out3;
    temp(:,:,2)=out5;
    temp(:,:,3)=out7;
    temp(:,:,4)=out9;
    out = max(temp,[],3);
    
end

5.2 算法测试及实验结果 

 

clc;clear;close all;

strDir = 'Set_1/';
strDir1 = 'Set_result/';
files = {'1.bmp','2.bmp','3.bmp','4.bmp'};
figure('units','normalized','outerposition',[0 0 1 1]);
for i=1:length(files)
    fprintf('%d/%d:%s\n', length(files), i, files{i});  % 打印当前处理进度
    I = imread([strDir files{i}]);
    
    if (size(I, 3) > 1)
        I = rgb2gray(I);
    end
    I = double(I);
    Out = MPCM_fun(I);  % result
    
    % Out = MPCM_fun_2(I);
    
    %% 阈值分割
    switch(i)
        case 1
            kth = 3;
        case 2
            kth = 3;
        case 3
            kth = 5;
        case 4
            kth = 12;
    end

    avg = mean(mean(Out));
    normal = std(std(Out));
    th = avg + kth*normal;
    bw = imbinarize(uint16(Out), th/65536);
    
    %% show result
    hold on;
    p = strcat('Image-', num2str(i));
    subplot(3, length(files), i), imshow(I,[]),title(p,'FontSize',15);
    
    if i == 1
        ylabel('Original Image','FontSize',20);
    end
    
    subplot(3, length(files), length(files)+i),imshow(Out,[]);
    if i == 1
        ylabel('Result','FontSize',20);
    end
    
    subplot(3, length(files), 2*length(files)+i),imshow(bw, []);
    if i ==1
        ylabel('Target Result','FontSize',20);
    end
end
saveas(gcf, './result/result3.png');

                                                                      图5 MPCM算法实验结果

5.3 结果分析

本文算法存的的缺陷:

  1. 不能自适应选择分割阈值(结论中作者也有提到);
  2. 实验结果(1)中,会将一个目标分割为两块,不能保留目标的形状及边缘(可能是由于求均值操作造成的) (2)中虚警很多,因为不知道目标的大小其背景复杂;(4)中如果不限定要检测的目标是亮目标,会将云层中暗的空洞检测为目标。

参考文献

[1] Y. Wei, X. You, and H. Li, “Multiscale patch-based contrast measure for small infrared target detection,” Pattern Recognit., vol. 58, pp. 216–226, 2016.

[2] C. L. P. Chen, H. Li, Y. Wei, T. Xia, and Y. Y. Tang, “A local contrast method for small infrared target detection,” IEEE Trans. Geosci. Remote Sens., vol. 52, no. 1, pp. 574–581, 2014.

[3] K. Zhang, K. Yang, S. Li, and H. B. Chen, “A Difference-Based Local Contrast Method for Infrared Small Target Detection under Complex Background,” IEEE Access, vol. 7, pp. 105503–105513, 2019.

[4] J. Han, Y. Ma, B. Zhou, F. Fan, K. Liang, and Y. Fang, “A robust infrared small target detection algorithm based on human visual system,” IEEE Geosci. Remote Sens. Lett., vol. 11, no. 12, pp. 2168–2172, 2014.

补充:人类视觉系统

1. 人类视觉系统的特性

(1)视觉关注

客观内容驱动的自底向上(bottom-up)关注模型:与周围区域具有较大差异性的目标容易吸引观察者的视觉关注;

主观命令指导的自顶向下(top-down)关注模型:受意识支配、依赖于特定的命令,可将视觉关注强行转移到某一特定区域。

(2)亮度及对比敏感度

  • 人眼对绝对亮度判断能力差
  • 人眼对外界亮度的感知更多地依赖于目标与背景的亮度差,但对亮度差的分辨能力是有限的,就像人眼只能分辨127阶灰度。

人眼对光强度具有自适应的调节功能,即能够通过调节感光灵敏度适应范围很广的亮度,这导致人眼对绝对亮度判断能力较差(e.g. 当我们在强光下看手机时,手机会自动调高亮度,而在黑暗中看手机时,手机疗毒会调低)。所以人眼对外界目标亮度的感知更多地依赖于目标与背景之间的亮度差,但人眼对亮度差的分辨能力有限,当亮度差较小时,人眼会认为其是一直的。

(3)视觉掩盖

(4)视觉内在推导机制

 

 

 

 

  • 32
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值