Why do I receive unrecognized function or variable "aMediantFilter_2D" error ?
显示 更早的评论
采纳的回答
yes,sir,please view
and get the file aMediantFilter_2D.m,then run the code
3 个评论
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
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 GPU Code Generation from MATLAB Applications 的更多信息
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- 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)

