在图像上滑动窗口会导致“内存不足或尺寸超出八度的索引类型”

octave

30 观看

1回复

8221 作者的声誉

当我mode在图像上运行时,出现错误:

错误:内存不足或尺寸过大而无法使用Octave的索引类型
错误:从
im2col在第134行第13列
调用nlfilter在第79行第8列
colour_blocks在第11行第7列

这到底是什么问题,我该怎么做才能克服呢?是我没有效率地遍历图像吗?目的是在图像上创建一个滑动窗口(256x256),并计算每个窗口中最频繁的颜色。

pkg load image;
pkg load signal;

% the image is quite small 400x400px
i = uint32(imread('foo.jpg'));


% encode 3 channel image into single channel
ienc = 1+bitor(bitor(i(:,:,1), bitshift(i(:,:,2),8)), bitshift(i(:,:,3),16));

% find the mode
imode = nlfilter(ienc, [256 256], @(x) mode(x(x~=0)));
作者: sazr 的来源 发布者: 2017 年 9 月 15 日

回应 1


0

11283 作者的声誉

是的,问题在于您的滑动窗口太大。看一下nlfilter源代码

256 * 256窗口表示每个窗口都有65536元素。如果图像为1024 * 1024,则将具有6.8719e + 10的视图,但是使用32位索引构建的Octave无法处理包含2147483647个以上元素的数组。另外,如果您的图像是双倍级别的,则视图将占用大约550GB的内存。

作者: carandraug 发布者: 2017 年 9 月 15 日
32x32