2014-12-02 111 views
-2

我有一个使用imread函数读取的图像。我的目标是在MATLAB中收集图像中的像素对。具体来说,我读过一篇论文,并试图重新创建以下场景:如何在MATLAB上对像素对进行分组

首先,将原始图像分组为像素值对。一对由两个相邻的像素值组成,或者两个具有小的差值。配对可以通过将同一行和连续列上的像素或垂直或基于键的特定模式配对来水平完成。配对可以通过图像的所有像素或只是其中的一部分。

我正在寻找重新创建水平配对方案。我不太确定我会如何在MATLAB中做到这一点。

+0

请更准确地询问你的问题。你想在图像中找到**所有像素**对吗?像素对的组合总数为“N *(N-1)/ 2”,其中“N”是图像中像素的总数。存储适当大小图像的所有像素对会使MATLAB快速耗尽内存。例如,一张500 x 500的图像会生成3.125 x 10^10个可能的图像像素对。请详细说明**您想要做什么**与这些像素对。 – rayryeng 2014-12-02 08:59:24

+0

呃。它只是连续最接近的2个像素。例如:1 2 3 4 5 6 - >(1,2); (3,4); (5,6) – 2014-12-02 10:59:47

+0

如果你有一个奇怪的大小的图像怎么办? '1 2 3 4 5 6 7'。你需要更好地解释你正在尝试做什么,因为已经有很多图像处理函数已经内置了这个函数对像素及其邻域的应用。 (例如'blockproc')。 – nkjt 2014-12-02 13:39:31

回答

1

假设您的图像是灰度图,我们可以使用ndgrid轻松生成2D坐标网格。我们可以使用这些来创建一个网格,然后将水平坐标右移到另一个网格,然后使用sub2ind将2D网格转换为线性索引。我们终于可以使用这些线性索引来创建我们在您的评论中描述的像素配对(您应该将它们添加到您的帖子中)。重要的是,您需要跳过连续的每一列,以确保独特的像素配对。

我也会假设你的图像是灰度。如果我们着色,这会稍微复杂一些,我会把它留给你作为学习练习。因此,如果你的形象是通过imread读取并存储在im,做这样的事情:

[rows,cols] = size(im); 
[X,Y] = ndgrid(1:rows,1:2:cols); 
ind = sub2ind(size(im), X, Y); 
ind_shift = sub2ind(size(im), X, Y+1); 
pixels1 = im(ind); 
pixels2 = im(ind_shift); 
pixels = [pixels1(:) pixels2(:)]; 

pixels将是一个二维数组,其中每行给你一个具体的配对的像素亮度的图像。请记住,我独立处理每一行。因此,只要我们完成了一行,我们只需转到下一行继续操作。这也假定您的图像具有,甚至列数。如果不是,你就有决定。您需要在图像的最后添加一列,此列可以是任何您想要的,或者您可以在处理之前从图像中删除此列。如果要填写此列,可以将其全部设置为零,也可以复制最后一列,并将其放在原始图像的最后一列旁边。因此,适当的预处理步骤可以看起来像这样:

if mod(cols,2) ~= 0 
    im = im(:,1:end-1); 
end 

上面的代码简单地去除图像中的最后一列,如果列数是奇数。一旦你运行这段代码,你可以运行我上面的第一个代码。


祝你好运!

+0

感谢您的帮助。我会尝试。你很热情! – 2014-12-03 08:49:34

+0

不客气。如果我帮忙,考虑接受我的答案。祝你好运! – rayryeng 2014-12-03 15:22:56

+0

你的回答很好。我已经在Matlab中测试过了。非常感谢! – 2014-12-03 18:25:57

相关问题