如果我正确理解你的问题,你想要将边缘检测图像分解成N
块,其中每个块的高度是图像的高度,同时计算每个块的宽度,使得其宽度为m
,其中N*m = width of image
。因此,每个块的宽度是width of image/N
。请记住,您必须选择一个值N
,以便它可以被图像的宽度整除。你的图像有460列,所以我们可以选择任意数量的可被10整除的块......所以我们选择10块。
分解图像最简单的方法是使用mat2cell
。这需要一个2D矩阵并将矩阵分割成几部分。每件作品将存储在单元阵列中的单个元素中。因此,您需要确保每个块的高度相同,并且每个块的宽度使用上面给出的公式。因此,你只需要这样做。我正在阅读直接从StackOverflow发布的示例图像,但图像实际上传为RGB。我将它转换,使我们得到一个实际的边缘图直接二进制:
N = 10; %// Declare total number of blocks
im = im2bw(imread('http://i.stack.imgur.com/ZvfoL.png')); %// Read in image
C = mat2cell(im, size(im,1), (size(im,2)/N)*ones(N,1));
C
将包含图像块,其中C{idx}
将让你位于指数idx
图像块。如果你想成为一个三维阵列,其中每个片给你你想要的图像块,只需使用cat
并连接在第三维度,像这样的:
C_matrix = cat(3, C{:});
因此,在访问块idx
,只需做C_matrix(:,:,idx)
。
作为视觉表现,让我们在数字显示每块:
figure;
hold on;
for idx = 1 : N
subplot(1,N,idx);
imshow(C{idx}); %// Or imshow(C_matrix(:,:,idx));
end
这就是我得到:
基本上,每个块放置在窗户本身的一个单独的图中,这就是为什么我使用subplot
。你可以看到块之间有一个白色的空白,它可以正确地显示图像中每个分离的块。
祝你好运!
你能上传原始图片吗?我希望能够重现您的结果。 – rayryeng 2014-12-01 21:36:02
另外,你的意思是把图像分成“N”等块“的宽度”?你能否详细说明一下?我不明白这是什么意思。你是否希望每个块的**高度**保持一致(可能是图像的高度),并且您想要将图像分解为宽度方向的块?难道你不能简单地做一个边缘检测整体(这是你所做的),然后将图像分成块进行进一步分析?为什么要先将图像分成块,然后计算边缘?如果你使用Prewitt操作符,那么它不应该有所作为。 – rayryeng 2014-12-01 21:41:59
@rayryeng我已经更新了这个问题,你可能会找到我想要如何分割图像的答案。 – Alladin 2014-12-01 21:49:33