2012-04-10 6 views
1

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

  1. x, y-Koordinate
  2. ein Wert von 1

(2) bis K eine große Menge an fester Größe Regionen Probe aus alle Bildformat in Angenommen:

  1. (x1, y1) - oben, links
  2. (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.

Antwort

1

Es gibt ein paar Dinge, die ich tun würde, um dies zu beschleunigen.

  1. Die letzte Zeile entfernt werden sollte (ids = find(ids);. Logische Masken sind viel schneller als eine Suche verwenden, und sie arbeiten in jedem Fall fast die eine Entdeckung Aussage funktionieren würde. Ich vermute, das Ihre Funktion erheblich beschleunigt, Kein Verlust von Funktionalität/Lesbarkeit
  2. Es könnte schneller sein, wenn Sie einige der Anweisungen s1, s2, s3 und s4 kombiniert haben
  3. Versuchen Sie, keine großen Datensätze in der for-Schleife zu erstellen, außer sie sind erforderlich. Insbesondere würde ich zwei Zeilen entfernen, um Folgendes zu tun: ids = roi_feat_ids(scw(j, :), feat);

Die letzten beiden könnten Sie ein wenig Zeit sparen, aber die erste sollte eine große Zeitersparnis sein. Viel Glück!

+0

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! –

+0

Eine einfache und effiziente Implementierung in Matlab MEX finden Sie hier auf meinem Blog: http://bit.ly/IgurHD –