быстрое вычисление гистограммы на сетке

У меня есть изображение в оттенках серого 200x200, и я хотел бы вычислить гистограмму интенсивности для каждого окна 8x8 в изображении. Как я могу вычислить это быстро? Я использую циклы for сейчас, но это так медленно. Мой текущий код выглядит так:

I = imread('image.jpg');
for i=1:8:height-7
    for j=1:8:width-7
       patch = I(i:i+7,j:j+7);
       % compute histogram for the patch
    end
end

person user499372    schedule 15.08.2011    source источник


Ответы (2)


Если у вас есть Image Processing Toolbox, вы можете использовать функцию blockproc который представляет собой скомпилированную и общую версию вашего цикла. Просто определите функцию обратного вызова для расчета гистограммы.

B = blockproc(I, [8 8], @myhistfun)
person Juhl    schedule 15.08.2011

Я думаю, что приведенный ниже код может ответить на ваш вопрос. Хитрость заключается в том, чтобы не вызывать какие-либо функции внутри цикла и заранее выделять все массивы. См., например. http://www.quantiphile.com/2010/10/16/optimizing-matlab-code/ для получения дополнительной информации об ускорении циклов. В любом случае, на моей машине ускоренный цикл ниже в 17 раз быстрее.

% image size
height = 800;
width = 1200;
window = 8;

% histogram bin centers
bin_centers = 0.05:0.1:1;

% here a random image as input
img = rand(height, width);

% verion using accelerated loops (for this to work there cannot be any
% function calls to not built-in functions)
tic
img3 = zeros(window^2, height*width/window^2);
ind = 1;
for i=1:window:height
    for j=1:window:width
       patch_ = img(i:i+window-1,j:j+window-1);
       img3(:,ind) = patch_(:);
       ind = ind + 1;
    end
end
hist_img3 = hist(img3, bin_centers);
toc


% probably version of user499372 calling hist function within the loop
tic
hist_img4 = zeros(size(hist_img3));
ind = 1;
for i=1:window:height
    for j=1:window:width
       patch_ = img(i:i+window-1,j:j+window-1);
       hist_img4(:,ind) = hist(patch_(:), bin_centers);
       ind = ind + 1;
       % compute histogram for the patch
    end
end
toc

% test the results
all(all(hist_img3==hist_img4))
person Mauro    schedule 15.08.2011