首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网格直方图的快速计算

网格直方图的快速计算
EN

Stack Overflow用户
提问于 2011-08-16 04:18:39
回答 2查看 1.1K关注 0票数 2

我有一张200x200的灰度图像,我想计算图像中每个8x8窗口的强度直方图。我怎么能计算得那么快呢?我现在使用for循环,但它太慢了。我当前的代码如下所示:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2011-08-16 05:35:46

如果您有图像处理工具箱,您可以使用函数blockproc,它是您的循环的编译和通用版本。只需将回调函数定义为计算直方图即可。

代码语言:javascript
复制
B = blockproc(I, [8 8], @myhistfun)
票数 5
EN

Stack Overflow用户

发布于 2011-08-16 05:41:15

我认为下面的代码可以回答你的问题。诀窍是不要在循环内调用任何函数,并预先分配所有数组。有关循环加速的更多信息,请参见例如http://www.quantiphile.com/2010/10/16/optimizing-matlab-code/。无论如何,在我的机器上,加速循环的速度是原来的17倍。

代码语言:javascript
复制
% 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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7070319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档