在数字图像处理时,我们经常会以窗口的形式进行相关的运算,如滤波处理,而在图像边界处,窗口可能太大以至于超出边界,这时候我们可以做一个映射(对称)处理,来补齐窗口中超出图像边界的部分。如下图,窗口大小是3*3大小,中间黄色像素为窗口中心像素,其位于图像左上角,对于窗口内超出图像边界的部分,分别将其赋值为以中心像素为对称中心的,与其对称的图像内像素的值。
现以InSAR中计算干涉图的相位标准差(PSD)的matlab代码来说明这个映射处理怎么用代码实现。(代码是我自己编写的,不一定效率最优)。
function [PSD] = calPSD(image,window_detrow,window_detcol)
%UNTITLED3 此处显示有关此函数的摘要
% 计算相位标准差图PSD
% image为输入的干涉图,PSD为计算得到的相位标准差
% 窗口大小,必须为奇数,
if ~(mod(window_detrow,2) && mod(window_detrow,2))
msgbox("窗口大小必须均为奇数!");
return;
end
window_centerRow=(window_detrow+1)/2;
window_centerCol=(window_detcol+1)/2;
window_PixelNum=window_detrow*window_detcol;
[image_detrow,image_detcol]=size(image);
% 计算PSD
PSD=0;
for m=1:image_detrow
for n=1:image_detcol
% 窗口矩阵
window=NaN(window_detrow,window_detrow);
% 为窗口矩阵赋值
for i_row=1:window_detrow
for i_col=1:window_detcol
% 每个窗口像素的实际行列数
row=m + i_row - window_centerRow;
col=n + i_col - window_centerCol;
% 判断窗口像素是否超出图像边界大小
% 如果超出,则将其赋值为该像素与窗口中心像素对称的像素的值
if row < 1 || row > image_detrow
row=m-i_row+window_centerRow;
end
if col < 1 || col > image_detcol
col=n-i_col+window_centerCol;
end
window(i_row,i_col)=image(row,col);
end
end
% 计算每个窗口的相位标准差detaPhi
% 统计矩阵内像素值为空值的像素个数
NaN_Num=0;
for i_row=1:window_detrow
for i_col=1:window_detcol
if isnan(window(i_row,i_col))
NaN_Num=NaN_Num+1;
end
end
end
meanPhi=nansum(reshape(window,window_PixelNum,1))/(window_PixelNum-NaN_Num);
detPhi=0;
for i_row=1:window_detrow
for i_col=1:window_detcol
if ~isnan(window(i_row,i_col))
detPhi=detPhi+(window(i_row,i_col) - meanPhi)^2;
end
end
end
detaPhi=sqrt(1/(window_PixelNum-1-NaN_Num)*detPhi);
% 计算PSD
PSD=PSD+detaPhi;
end
end
PSD=PSD/(image_detrow*image_detcol);
end