Ich bin auf der Suche nach einigen bereits vorhandenen Funktionen/Tools, um Standard Tasche von Visual Words Histogrammen aus mehreren ROI (Regionen von Interesse) in einem Bild zu berechnen. Lassen Sie mich erklären:Effiziente Histogramm Berechnung von Bild ROIs
(1) Angenommen, Sie haben ein Bild, wo jedes "Pixel" eine ganze Zahl trägt: 1 ... K Jede solche "Pixel" hat folgende Informationen
- x, y-Koordinate
- ein Wert von 1
(2) bis K eine große Menge an fester Größe Regionen Probe aus alle Bildformat in Angenommen:
- (x1, y1) - oben, links
- (x2, y2) Koordinaten - unten, rechts Koordinaten
(3) Für jede Region: Compute a K Behälter-Histogramm, die Anzahl von Vorkommen der Zählwerte „Pixel“ Werte, die in dieser Region fallen
ich folgende Funktion in MATLAB implementiert haben, aber aufgrund mehrerer für Schleifen im Code, ist es sehr langsam ist
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);
ich habe auf Routinen sah Vorschlag OpenCV und sogar in Int el's MKL hat aber nichts passendes gefunden. Mit dem Matlab-Profiler habe ich festgestellt, dass viel Zeit in roi_feat_ids() steckt und die äußere Schleife über jeder Region in der Funktion sph_roi() ebenfalls langsam ist. Bevor ich versuche, eine MEX-Datei zu implementieren, würde ich gerne sehen, ob ich vorhandenen Code wiederverwenden könnte.
Vielen Dank für Ihre Anregungen. Ich habe die MEX-Version dieser Funktion implementiert (noch nicht vollständig debuggt). Ich werde sehen, wie es mit diesem beschleunigten Code verglichen wird. Prost! –
Eine einfache und effiziente Implementierung in Matlab MEX finden Sie hier auf meinem Blog: http://bit.ly/IgurHD –