Why do I receive unrecognized function or variable "aMediantFilter_2D" error ?
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments
0 votes
Accepted Answer
yes,sir,please view
and get the file aMediantFilter_2D.m,then run the code
3 Comments
Still the problem exists
Unrecognized function or variable 'aMediantFilter_2D'.
Error in aMedianFilter_2D_script (line 13)
[pixel_val, pixel_valid] = aMediantFilter_2D(c_data, c_idx);
% 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
Pratiksha Joshi
on 19 Feb 2022
Thank you.
More Answers (0)
Categories
Find more on HDL Applications for MATLAB Algorithms in Help Center and File Exchange
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
