Why do I receive unrecognized function or variable "aMediantFilter_2D" error ?
18 views (last 30 days)
Show older comments
Accepted Answer
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
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
More Answers (0)
See Also
Categories
Find more on HDL Applications for MATLAB Algorithms in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
