%
% Author: Raul Correal
% Date: Sept 2011
% (raulcorreal@hotmail.com)
%
% Filter disparities based on spatial continuity clusters
%
% Input:
% - image: original image path
% - filter: could be:
% - 0: filter out all but the largets cluster
% - 1: filter out the largets cluster
% - 2: filter out clusters with less than "num" pixels
% - 3: filter out the "num" smallest clusters
% - num: number of pixels to be uses with selected filter
%
% Output
% - filteredImage: filtered image
%
function [clusters filteredImage] = clusteringFilter(image, filter, num, connectivity)
image = uint8(image);
CC = bwconncomp(image, connectivity);
fprintf('%d clusters found!\n', CC(1).NumObjects);
numPixels = cellfun(@numel,CC.PixelIdxList);
clusters = zeros(size(image,1), size(image,2));
%S = regionprops(CC,'Centroid');
for i = 1:size(numPixels,2)
fprintf('cluster %d: %d pixels\n', i, numPixels(i));
clusters(CC.PixelIdxList{i}) = i;
end
%figure;imagesc(A);impixelinfo;
filteredImage = image;
filtered = 0;
if filter == 0
%filter out all but the largets cluster
[biggest,idx] = max(numPixels);
%fprintf('Largest cluster: %d, with %d pixels\n', idx, biggest);
for i = 1:size(numPixels,2)
if i ~= idx
filteredImage(CC.PixelIdxList{i}) = 0;
filtered = filtered + numPixels(i);
end
end
elseif filter == 1
%filter out the largets cluster
[biggest,idx] = max(numPixels);
%fprintf('Largest cluster: %d, with %d pixels\n', idx, biggest);
filteredImage(CC.PixelIdxList{idx}) = 0;
filtered = filtered + numPixels(idx);
elseif filter == 2
%filter out clusters with less than "num" pixels
for i = 1:size(numPixels,2)
if numPixels(i) < num
filteredImage(CC.PixelIdxList{i}) = 0;
filtered = filtered + numPixels(i);
end
end
elseif filter == 3
%filter out the largets cluster
for i = 1:num
[smallest, idx] = min(numPixels);
%fprintf('minimo cluster %d: con %d pixels\n', idx, numPixels(idx));
filteredImage(CC.PixelIdxList{idx}) = 0;
filtered = filtered + numPixels(idx);
numPixels(idx) = intmax;
end
end
fprintf('%d pixels filtered out!\n', filtered);
end