如何应用具有阈值的自定义中值滤波器?

时间:2017-11-02 12:17:54

标签: matlab image-processing median

我正在尝试为我的图像处理创建一个自定义中值滤波器,对于3x3邻域,中心像素(被更改)被排除在外。因此我的内核

 1     1     1
 1     0     1
 1     1     1

但我想只将中心像素更改为周围像素的中值,如果其值偏差超过周围像素某个阈值。例如。如果像素大于周围像素中值的10倍,则中心像素值将更改为中位数。

我已经看过使用ordfilt2了,我可以用它创建一个中值滤波器。但我不确定如何实现阈值条件。我基本上试图删除我的图像中符合我内核中的阈值条件的任何异常值。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您没有这样做的功能,但ord2filt是一个良好的开端。

N = uint8([1 1 1 ; 1 0 1 ; 1 1 1]);   % neighborhood, faster with integer class
J = (ordfilt2(I,4,N) + ordfilt2(I,5,N))/2;   % median of even set
M = I>J+10;    % put here your threshold method
Out = I;
Out(M) = J(M);

Rem:问题已经问here,但没有任何好的答案IMO。

答案 1 :(得分:0)

我建议采用以下方法:

%defines input
A = repmat(1:5,5,1);

%step 1: median filtering, ignoring the central pixel
fun = @(x) median([x(1:ceil(length(x(:))/2-1)),x(ceil(length(x(:))/2+1):end)]);
filteredA = nlfilter(A,[3 3],fun);

%step 2: changing each pixel, onlyt if its 10 times bigger from the median
result = A;
changeMask = (A./filteredA)>10 | (A./filteredA)<0.1;
result(changeMask ) = filteredA(changeMask);
相关问题