【发布时间】:2017-10-26 20:35:36
【问题描述】:
我尝试提取图像的 8 个相邻像素。但是我想同时为数百个位置执行此操作(函数中的row 和column)。这意味着输出Block是一个3D矩阵,3D矩阵的每个切片对应一个位置。
function Block = getNeighbours(image, row, column)
% Create a 3x3 matrix that contains the neighbors of the point (row,column)
row=round(row(:));
column=round(column(:));
neighbors_x = [row(:,1)-1 row(:,1) row(:,1)+1];
neighbors_y = [column(:,1)-1 column(:,1) column(:,1)+1];
Block = zeros(3,3,size(row,1));
for i=1:size(row,1)
Block(:,:,i) = image(neighbors_x(i,:), neighbors_y(i,:)); %can I avoid this loop?
end
end
从上面的代码中,我需要循环来完成这项工作。这似乎是这个功能的瓶颈,对于数千个地点来说,这绝对是没有效率的。有什么办法可以避免这种情况?
您可以通过以下方式尝试此功能:
image=randi([1 255], [300 300]);
row=randi([1 200], [1 1000]);
column=randi([1 200], [1 1000]);
block=getNeighbours(image, row, column);
【问题讨论】:
-
你打算用这些块做什么?这听起来很可疑,就像您正在尝试以艰难的方式进行卷积。
-
您对卷积的“硬”方式是正确的。由于我有数千个不同的内核,
convn将非常昂贵。我使用的方法只考虑块而不是整个图像。convn(image,kernels)会很耗时。或许你有什么建议? -
您应该首先使用
conv2对解决方案进行基准测试。除非您的图像很大并且您只使用少数社区,否则很难被击败。
标签: matlab loops for-loop image-processing matrix