How can i modiy this SNN filter code to handle color images? Also it takes much time. I got this over net. plz anybody suggest / improve this.
1 view (last 30 days)
Show older comments
function [Y,Xpad] = snn12(X,WINSZ,true)
% [Y,Xpad] = SNN(X[,WINSZ][,progress])
% perform symmetric nearest-neighbor nonlinear edge-preserving filtering on
% an intensity image
%
% * If no window size WINSZ is specified, the default is 5.
% * Setting progress to a nonzero value causes SSN to display
% the current row it is processing.
%
% Description:
% The SNN filter works by looking at each pair of pixels opposite the
% output (center) pixel. From each pair, the one that is closest to
% the output pixel is used to compute the output (mean of all selected
% pixels).
%
% Notes:
% Image is converted to double format for processing.
%
% Copyright Art Barnes, 2005 artbarnes<at>ieee<dot>org
if nargin >= 3
verboseFlag = true;
else
verboseFlag = false;
end
if nargin < 2
WINSZ = 3;
end
if ~isa(X,'double')
X = im2double(X);
end
PADDING = floor(WINSZ/2);
Xpad = padarray(X,[PADDING PADDING],'symmetric','pre');
[padRows,padCols] = size(Xpad);
Y = zeros(size(X));
nRowIters = length((PADDING+1):(padRows-PADDING));
count = 1;
for i = (PADDING+1):(padRows-PADDING)
for j = (PADDING+1):(padCols-PADDING)
% window
W = Xpad((i-PADDING):(i+PADDING),(j-PADDING):(j+PADDING));
Wtop = W(1:PADDING,:)';
Wtop = Wtop(:)';
Wtop = [Wtop W(PADDING+1,1:PADDING)];
Wbot = W((end-PADDING+1):end,:)';
Wbot = Wbot(:)';
Wbot = [W(PADDING+1,(end-PADDING+1):end) Wbot];
Wbot = fliplr(Wbot);
NN = [Wtop; Wbot];
NNdiff = abs(NN - W(PADDING+1,PADDING+1)); % or use X(i,j)
[y,ids] = min(NNdiff);
for k = 1:length(ids)
NNnearest(k) = NN(ids(k),k);
end
Y(i,j) = mean([NNnearest Xpad(i,j)]);
end
%if verboseFlag & ~mod(count,10)
% fprintf('SNN: %d/%d\n',count,nRowIters);
%end
count = count + 1;
end
0 Comments
Answers (1)
Image Analyst
on 2 Jan 2014
Edited: Image Analyst
on 3 Jan 2014
Just apply it to each color channel one at a time. If you get color artifacts from that, then convert to hsv space with rgb2hsv() and apply it to only the v channel, then get back to rgb with hsv2rgb(), which is probably a lot faster than the 3 color channel approach since you only call the filter twice, though you do have two color space conversions.
See attached demo. (I did not include the function in the file I uploaded because of the copyright mentioned.)
See Also
Categories
Find more on Convert Image Type in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!