我正在寻找一些已经存在的函数/工具来计算图像中多个 ROI(感兴趣区域)的标准视觉词袋直方图。让我解释:
(1) 假设您有一个图像,其中每个“像素”带有一个整数:1 ... K 每个这样的“像素”都有以下信息
- x,y 坐标
- 从 1 到 K 的值
(2) 假设从所有图像中抽取大量固定大小的区域,格式为:
- (x1,y1) - 上、左坐标
- (x2,y2) - 底部,右侧坐标
(3) 对于每个区域:计算一个 K bin 直方图,计算落在该区域中的“像素”值的出现次数
我在 MATLAB 中实现了以下函数,但由于代码中有多个 for 循环,它非常慢
function [H words] = sph_roi( wind, tree, desc, feat, bins )
% FUNCTION computes an SPH histogram for a collection of windows. Spatial
% information is captured by splitting the window in bins horizontally.
%
% [H words] = sph_roi( obj_wind, tree, desc, feat, [ bins ] );
%
% INPUT :
% wind - sampled ROI windows
% [left_x, top_y, right_x, bottom_y] - see sample_roi()
% tree - vocabulary tree
% desc - descriptors matrix
% feat - features matrix
% bins - number of horizontal cells (1=BOVW, 2... SPH)
% by default set to the multiples of window height.
%
% OUTPUT :
% H - SPH histograms
% words - word IDs found for every descriptor
%
verbose = 0;
% input argument number check
if nargin < 4
error( 'At least 4 input arguments required.' );
end
% default number of horizontal cells
if nargin < 5
bins = -1; % will be set in multiples of each window height corresp.
end
% number of windows
num_wind = size( wind, 1 );
% number of visual words
num_words = tree.K;
% pre-compute all visual words
words = vl_hikmeanspush( tree, desc );
% initialize SPH histograms matrix
H = zeros( num_words * bins, num_wind );
% compute BOVW for each ROI
for i = 1 : num_wind
if verbose == 1
fprintf( 'sph_roi(): processing %d / %d\n', i, num_wind );
end
% pick a window
wind_i = wind( i, : );
% get the dimensions of the window
[w h] = wind_size( wind_i );
% if was not set - the number of horizontal bins
if bins == -1
bins = round( w / h );
end
% return a list of subcell windows
scw = create_sph_wind( wind_i, bins );
for j = 1 : bins
% pick a cell
wind_tmp = scw( j, : );
% get the descriptor ids falling in that cell
ids = roi_feat_ids( wind_tmp, feat );
% compute the BOVW histogram for the current cell
h = vl_hikmeanshist( tree, words(ids) );
% assemble the SPH histogram in the output matrix directly
H( 1+(j-1)*num_words : j*num_words, i ) = h( 2:end );
end
end
function ids = roi_feat_ids( w, f )
% FUNCTION returns those feature ids that fall in the window.
%
% ids = roi_feat_ids( w, f );
%
% INPUT :
% w - window
% f - all feature points
%
% OUTPUT :
% ids - feature ids
%
% input argument number check
if nargin ~= 2
error( 'Two input arguments required.' );
end
left_x = 1;
top_y = 2;
right_x = 3;
bottom_y = 4;
% extract and round the interest point coordinates
x = round( f(1,:) );
y = round( f(2,:) );
% bound successively the interest points
s1 = ( x > w(left_x) ); % larger than left_x
s2 = ( x < w(right_x) ); % smaller than right_x
s3 = ( y > w(top_y) ); % larger than top_y
s4 = ( y < w(bottom_y) ); % smaller than bottom_y
% intersection of these 4 sets are the ROI enclosed interest points
ids = s1 & s2 & s3 & s4;
% convert ids to real
ids = find( ids );
我查看了 OpenCV 甚至在英特尔的 MKL 中提出的例程,但没有发现任何合适的。使用 Matlab 的分析器,我发现在 roi_feat_ids() 中花费了大量时间,并且函数 sph_roi() 中每个区域的外循环也很慢。在尝试实现 MEX 文件之前,我想看看是否可以回收一些现有代码。