ECG-Kit 1.0
(4,530 bytes)
%IM_FEATURES Fixed mapping computing image features by the Matlab image toolbox
%
% F = IM_FEATURES(A,GRAY,FEATURES)
%
% INPUT
% A Dataset with binary object images dataset
% GRAY Gray-valued images (matched with A, optional)
% FEATURES Features to be computed
%
% OUTPUT
% F Dataset with computed features
%
% This function is a *replacement* for the function IM_MEASURE that is
% based on the DipLib measure.m. This implementation is using the Matlab
% function REGIONPROPS from the image toolbox. Use HELP REGIONPROPS to
% find out which features are exactly supported.
% In each image of the measurement set GRAY the features given in FEATURES
% are measured. In A a segmented version of GRAY has to be supplied.
% When no GRAY is supplied, the binary images in A are used.
%
% Use FEATURES = 'all' for computing all features.
%
% SEE ALSO
% DATASETS, DATAFILES, REGIONPROPS
% Copyright: D.M.J.Tax, D.M.J.Tax@prtools.org.
% Faculty EWI, Delft University of Technology
% P.O. Box 5031, 2600 GA Delft, The Netherlands
function b = im_features(a,gray,features)
if nargin < 3 features = []; end
if nargin < 2 gray = []; end
if nargin < 1 | isempty(a)
b = prmapping(mfilename,'fixed',{gray,features});
b = setname(b,'Image features');
elseif isa(a,'prdataset')
if (nargin < 3 | isempty(features)) & ~isdataset(gray)
features = gray;
gray = a;
end
if ~strcmp(class(a),class(gray))
error('Binary and gray images should be both datasets or datafiles')
end
fsize = getfeatsize(a);
if any(getfeatsize(gray) ~= fsize)
error('Image structures of binary and gray images should be identical')
end
if length(fsize) == 2, fsize = [fsize 1]; end
if size(a,1) ~= size(gray,1)
error('Same number of binary and gray images expected')
end
if isempty(features)
features = 'all';
end
% first generate the correct feature labels, and a structure PROPS
% that can be used in REGIONPROPS of Matlab:
im = data2im(a(1,:));
[props,featlab] = getlabfromregionprops(im,data2im(gray(1,:)),features);
% RD 27Nov13, compute dat size before
ftrial = getfeatfromregionprops(im,data2im(gray(1,:)),props);
out = zeros(size(a,1),numel(ftrial));
% Run over all images, and compute the features:
for n = 1:size(a,1)
out(n,:) = getfeatfromregionprops(data2im(a,n),data2im(gray,n),props);
end
% store in a dataset:
%b = prdataset(out,getlabels(a));
b = prdataset(out);
b = setlablist(b,getlablist(a));
b = setnlab(b,getnlab(a));
b = setfeatlab(b,featlab);
b = setprior(b,getprior(a,0));
b = setname(b,getname(a));
elseif isa(a,'double')
if (nargin < 3 | isempty(features)) & ~isdataset(gray)
features = gray;
gray = a;
end
[props,featlab] = getlabfromregionprops(a,gray,features);
b = getfeatfromregionprops(a,gray,props);
else
error('Wrong input')
end
return
% [props,featlab] = getlabfromregionprops(im,gray,features)
%
% Generate a structure PROPS and a cell-array FEATLAB that contains the
% features that are extracted from the images. PROPS is used in the
% Matlab function REGIONPROPS.
function [props,featlab] = getlabfromregionprops(im,gray,features)
% compute the properties:
%keyboard
thr = min(im(:)) + (max(im(:))-min(im(:)))/2;
r = regionprops((im>thr),gray,features);
props = fieldnames(r);
% we do it complicated like this, because bwprops could have been 'all',
% and by this we now get all possible (black and white) properties
% remove the things that we are not interested in:
% RD 27Nov13, PixelValues added
rmfeatures = {'PixelList', 'SubarrayIdx', 'ConvexHull','ConvexImage', ...
'Image', 'FilledImage', 'PixelIdxList', 'Extrema', 'PixelValues'};
props = setdiff(props,rmfeatures);
% generate the feature labels
featlab = {};
nr = 0;
for i=1:length(props)
nrf = size(getfield(r,props{i}),2);
if nrf>1 % there are more measurements per single property
for j=1:nrf
nr = nr+1;
featlab{nr} = [props{i},num2str(j)];
end
else % one measurement per property
nr = nr+1;
featlab{nr} = props{i};
end
end
featlab = strvcat(featlab);
return
% f = getfeatfromregionprops(im,gray,props)
%
% Compute the features F from the images IM. Which features are computed
% is defined in PROPS.
function f = getfeatfromregionprops(im,gray,props)
thr = min(im(:)) + (max(im(:))-min(im(:)))/2;
r = regionprops((im>thr),gray,props);
f = [];
for i=1:length(props)
f = [f getfield(r,props{i})];
end