目录
一、理论基础
在数字图像处理中,图像去噪是一个十分重要的问题。由于种种原因,图像可能会受到不同程度的噪声干扰,如椒盐噪声、高斯噪声、泊松噪声等。这些噪声会影响图像的质量和可用性,因此需要将其去除。近年来,非局部中值滤波(Non-Local Means Median,NLEM)算法在图像去噪领域中得到了广泛的应用。
非局部中值滤波算法的基本思想是利用图像中相似像素的信息来进行滤波。对于一个像素点(i,j),其滤波后的像素值可以表示为:
I_{i,j} = \frac{1}{Z_{i,j}}\sum_{k=1}^{K}w_{k}(I_{p_k}-I_{q_k})
其中,K是相似像素的数目,p_k和q_k是与像素点$(i,j)$相似度最高的像素的位置,w_k是像素p_k和q_k之间的相似度,$Z_{i,j}$是归一化系数,可以表示为:
Z_{i,j} = \sum_{k=1}^{K}w_k
可以看出,NLEM算法对于每个像素点,都通过相似度计算的方法,选择了与其相似度较高的像素,进行加权平均得到滤波结果。
基于NLEM的欧几里得中值滤波算法是将NLEM算法和欧几里得中值滤波算法结合起来的一种图像去噪算法。具体地,该算法首先将图像划分成若干个小块,然后对每个小块进行非局部中值滤波,最后将每个小块的滤波结果拼接起来得到滤波后的图像。该算法的具体步骤如下:
将图像划分成大小为m\times n的小块。对于每个小块,使用非局部中值滤波算法进行滤波。将每个小块的滤波结果拼接成为滤波后的图像。该算法的优点是可以同时处理多种类型的噪声,如椒盐噪声、高斯噪声、泊松噪声等。同时,该算法还可以处理大尺度噪声,从而提高图像的质量和可用性.
二、核心程序
function imgDenoised = NLEM(imgNoisy, h, P, S)
[m, n] = size(imgNoisy);
N = 2*P + 1;
h2 = h * h;
kNN = ceil ( (2*S + 1)^2 / 2 ); % top 50% of the neighbors used
imgPad = padarray(imgNoisy, [P P], 'symmetric');
imgDenoised = zeros(m,n);
fprintf('Looping over pixels....\n');
for i = 1 : m
ii = i + P;
for j = 1 : n
jj = j + P;
patchRef = imgPad(ii - P : ii + P, jj - P : jj + P);
pmin = max(i - S, 1) + P;
qmin = max(j - S, 1) + P;
pmax = min(i + S, m) + P;
qmax = min(j + S, n) + P;
s1 = pmax - pmin + 1;
s2 = qmax - qmin + 1;
w = zeros(s1, s2);
neighborPatches = zeros(s1, s2, N^2);
patchCurrent = zeros(2*P + 1, 2*P + 1);
patch = zeros(N, N); %#ok<*NASGU>
u = 0;
for p = pmin : pmax
u = u + 1;
v = 0;
for q = qmin : qmax
v = v + 1;
patchCurrent = imgPad(p - P : p + P, q - P : q + P);
d2 = sum(sum( (patchRef - patchCurrent) ...
.* (patchRef - patchCurrent) ));
w(u, v) = exp(- d2 / h2);
patch = imgPad(p - P : p + P, q - P : q + P);
neighborPatches(u, v, :) = reshape(patch, [N^2 1]);
end
end
% sort weights
w = reshape(w, [s1*s2 1]);
[w , I] = sort(w, 'descend');
L = min(kNN, s1*s2);
f = reshape(neighborPatches, [s1*s2 N^2])';
median = findEuclideanMedian(f(: , I(1 : L)), w(1 : L));
patch_est = reshape(median, [N N]);
imgDenoised(i, j) = patch_est(P + 1, P + 1);
end
end
UP179