Why do I receive unrecognized function or variable "aMediantFilter_2D" error ?

18 views (last 30 days)

Accepted Answer

yanqi liu
yanqi liu on 17 Feb 2022
Edited: yanqi liu on 17 Feb 2022
yes,sir,please view
and get the file aMediantFilter_2D.m,then run the code
  3 Comments
yanqi liu
yanqi liu on 17 Feb 2022
Edited: yanqi liu on 17 Feb 2022
% use https://ww2.mathworks.cn/matlabcentral/fileexchange/30068-adaptive-median-filter-matlab-code
% just for discuss
clc; clear all; close all;
I = imresize(imread('cameraman.tif'),0.3,'bilinear');
I = imnoise(I,'salt & pepper');
J = I;
smax = 9;
[nrows ncols] = size(I);
ll = ceil(smax/2);
ul = floor(smax/2);
for ii=1:ncols-smax
for jj=1:nrows-smax
c_idx = ii;
c_data = double(I(jj:jj+smax-1, ii));
[pixel_val, pixel_valid] = aMediantFilter_2D(c_data, c_idx);
if pixel_valid
J(jj, ii) = pixel_val;
end
end
end
h = figure;
set( h, 'Name', [ mfilename, '_plot' ] );
subplot( 1, 2, 1 );
imshow( I, [ ] );
subplot( 1, 2, 2 );
imshow( J, [ ] );
%#codegen
function [pixel_val, pixel_valid] = aMediantFilter_2D(c_data, c_idx)
smax = 9;
persistent window;
if isempty(window)
window = zeros(smax, smax);
end
cp = ceil(smax/2); % center pixel;
w3 = -1:1;
w5 = -2:2;
w7 = -3:3;
w9 = -4:4;
r3 = cp + w3; % 3x3 window
r5 = cp + w5; % 5x5 window
r7 = cp + w7; % 7x7 window
r9 = cp + w9; % 9x9 window
d3x3 = window(r3, r3);
d5x5 = window(r5, r5);
d7x7 = window(r7, r7);
d9x9 = window(r9, r9);
center_pixel = window(cp, cp);
% use 1D filter for 3x3 region
outbuf = get_median_1d(d3x3(:)');
[min3, med3, max3] = getMinMaxMed_1d(outbuf);
% use 2D filter for 5x5 region
outbuf = get_median_2d(d5x5);
[min5, med5, max5] = getMinMaxMed_2d(outbuf);
% use 2D filter for 7x7 region
outbuf = get_median_2d(d7x7);
[min7, med7, max7] = getMinMaxMed_2d(outbuf);
% use 2D filter for 9x9 region
outbuf = get_median_2d(d9x9);
[min9, med9, max9] = getMinMaxMed_2d(outbuf);
pixel_val = get_new_pixel(min3, med3, max3, ...
min5, med5, max5, ...
min7, med7, max7, ...
min9, med9, max9, ...
center_pixel);
% we need to wait until 9 cycles for the buffer to fill up
% output is not valid every time we start from col1 for 9 cycles.
persistent datavalid
if isempty(datavalid)
datavalid = false;
end
pixel_valid = datavalid;
datavalid = (c_idx >= smax);
% build the 9x9 buffer
window(:,2:smax) = window(:,1:smax-1);
window(:,1) = c_data;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [min, med, max] = getMinMaxMed_1d(inbuf)
max = inbuf(1);
med = inbuf(ceil(numel(inbuf)/2));
min = inbuf(numel(inbuf));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [min, med, max] = getMinMaxMed_2d(inbuf)
[nrows, ncols] = size(inbuf);
max = inbuf(1, 1);
med = inbuf(ceil(nrows/2), ceil(ncols/2));
min = inbuf(nrows, ncols);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function new_pixel = get_new_pixel(...
min3, med3, max3, ...
min5, med5, max5, ...
min7, med7, max7, ...
min9, med9, max9, ...
center_data)
if (med3 > min3 && med3 < max3)
new_pixel = get_center_data(min3, med3, max3,center_data);
elseif (med5 > min5 && med5 < max5)
new_pixel = get_center_data(min5, med5, max5,center_data);
elseif (med7 > min7 && med7 < max7)
new_pixel = get_center_data(min7, med7, max7,center_data);
elseif (med9 > min9 && med9 < max9)
new_pixel = get_center_data(min9, med9, max9,center_data);
else
new_pixel = center_data;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [new_data] = get_center_data(min,med,max,center_data)
if center_data <= min || center_data >= max
new_data = med;
else
new_data = center_data;
end
end
%#codegen
function outbuf = get_median_1d(inbuf)
numpixels = length(inbuf);
tbuf = inbuf;
for ii=coder.unroll(1:numpixels)
if bitand(ii,uint32(1)) == 1
tbuf = compare_stage1(tbuf);
else
tbuf = compare_stage2(tbuf);
end
end
outbuf = tbuf;
end
function outbuf = compare_stage1(inbuf)
numpixels = length(inbuf);
tbuf = compare_stage(inbuf(1:numpixels-1));
outbuf = [tbuf(:)' inbuf(numpixels)];
end
function outbuf = compare_stage2(inbuf)
numpixels = length(inbuf);
tbuf = compare_stage(inbuf(2:numpixels));
outbuf = [inbuf(1) tbuf(:)'];
end
function [outbuf] = compare_stage(inbuf)
step = 2;
numpixels = length(inbuf);
outbuf = inbuf;
for ii=coder.unroll(1:step:numpixels)
t = compare_pixels([inbuf(ii), inbuf(ii+1)]);
outbuf(ii) = t(1);
outbuf(ii+1) = t(2);
end
end
function outbuf = compare_pixels(inbuf)
if (inbuf(1) > inbuf(2))
outbuf = [inbuf(1), inbuf(2)];
else
outbuf = [inbuf(2), inbuf(1)];
end
end
%#codegen
function outbuf = get_median_2d(inbuf)
outbuf = inbuf;
[nrows, ncols] = size(inbuf);
for ii=coder.unroll(1:ncols)
colData = outbuf(:, ii)';
colDataOut = get_median_1d(colData)';
outbuf(:, ii) = colDataOut;
end
for ii=coder.unroll(1:nrows)
rowData = outbuf(ii, :);
rowDataOut = get_median_1d(rowData);
outbuf(ii, :) = rowDataOut;
end
end

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!