【问题标题】:How to partition an image to 64 block in matlab如何在matlab中将图像分区为64块
【发布时间】:2011-03-06 01:09:38
【问题描述】:

我想为每个图像计算颜色布局描述符(CLD)。这个算法包括四个阶段。在第一阶段,我必须将每个图像划分为 64 个块 i(8×8)n,以便从每个块中计算一个代表颜色。我尝试使用(For 循环)将图像划分为 64 个块,但我得到了 64廷形象。我想用(8×8)块获得图像,以便通过应用 DCT 变换然后之字形扫描来完成算法

【问题讨论】:

  • 解决方案相当简单。如果您可以通过开始接受答案来向我表明您关心任何帮助,我将与您分享我的解决方案。
  • 拜托,你能解释一下你的意思吗?我提出问题,如果您有问题,我需要解决方案。我的问题有什么问题吗?
  • @zenab,到目前为止,您已经提出了 10 个问题。人们已经花时间和精力来回答您的问题,但您不会通过将答案标记为已接受来承认他们的帮助。这只是让您在这里享有免费加载者的声誉,他们使用 stackoverflow 作为家庭作业解决资源。
  • 这不是事实 .. 我总是为任何合适的答案写 commont,我不是通过使用 stackowerflow 作为家庭作业解决资源的免费下载器
  • zenab,我只是在解释 jonas 的意思。在每个答案的投票数和上下箭头下,都有一个复选标记(勾号)。如果您喜欢一个答案,或者它可以帮助您做您想做的事,请单击它。这就是乔纳斯要求你做的所有事情。我不怪你......如果你是stackoverflow的新手,你并不总是很清楚你必须这样做,而且我也不是第一次这样做。不管怎样,我已经在下面回答了你的问题。

标签: image matlab data-partitioning


【解决方案1】:

将图像分割成块然后对其进行一些处理的一种方法是使用内置函数BLOCKPROC(在旧版本的 Matlab 中称为blkproc)。

%# find block length in order to get 64 blocks
imageSize = size(img);
blockLen = round(imageSize(1:2)/8);

%# apply a function to each block
out = blocproc(img,blockLen,@myFunction)

myFunction 是您希望应用于每个块的函数。您可以将其定义为代码的子函数、单独的 m 文件或匿名函数。输出将连接到一个 8x×8x 数组中,其中 x 是函数输出的大小。 myFunction 应该有一个输入参数 blockStruct,它是一个结构体,其字段 data 包含块的像素值,以及字段 borderblockSizeimageSize 和 @987654331 @。

【讨论】:

  • 非常感谢 .. 只是我想提一下 blocproc 它写成 blkproc .. 我应用了你的代码,我得到了我想要的 .. 再次感谢你
  • 对不起,我忘了问你...当我使用 blkproc 函数时,我必须使用 rgb2gray 函数将图像转换为灰度级.. 是否写入?因为当我没有转换为灰度时,我收到以下错误:下标分配尺寸不匹配。 ==> blkproc 中的错误 89 aa(border(1)+(1:ma),border(2)+(1:na)) = a;我想计算颜色布局描述符(CLD)。如果我转换为灰度级对我的结果有任何影响吗?
  • @zenab:关于blkproc 的优点:这个函数近年来已经改名了。虽然当前版本 (blockproc) 可以处理 3D 输入数组,但旧版本 (blkproc) 似乎不能。由于rgb2gray 将(大致)为您提供图像的亮度,因此您很可能会丢失一些 CLD 所需的信息。
  • 感谢您提供这些信息...我会尝试使用新版本,因为我现在使用的是 R2008a..
  • @zenab: blockproc 于 2009b 年问世。
【解决方案2】:

这里是我之前为完全相同的问题(8x8 块、DCT 系数等)编写的一些代码......

img=imread('filename')
[img_x,img_y]=size(img);

block_size=8;
slide_len=1;

for ix=block_size/2:slide_len:img_x-block_size/2
    for jy=block_size/2:slide_len:img_y-block_size/2
        current_block=img((ix-block_size/2+1):(ix+block_size/2),(jy-block_size/2+1):(jy+block_size/2));
        dct_coeff=reshape(dct2(current_block),1,block_size^2);

        <insert any other code you want to run here>
    end
end

slide_len 设置一个块和下一个块之间的偏移量。在这种情况下,它每次偏移一个像素。但是,如果您想要不重叠的块,则应将其设置为 8。通常在此应用程序中,您会使用一些重叠。

【讨论】:

  • 现在我在应用您的答案之前打勾......当我得到结果时,我会通知你......我想告诉你我不需要覆盖计算 CLD。我只需要这 64 个街区。再次感谢,我向你道歉,非常感谢。
  • 我应用了你的编码,但我得到了 1875 块...请我尝试应用 CLD 方法,如维基百科网站中的解释...我的意思是我想划分每个图像(大小为 200 ×200) 到 64 块在这种情况下每个块变成大小 (25×25) 得到 (8×8) 块.. 我希望我能清楚地解释我的问题。
  • 啊,我明白了……您需要将图像划分为 64 个块。每个块都是 25x25,对吧?在这种情况下,设置block_size=25slide_len=25
  • o'b:您可以在不使用 for 循环的情况下实现相同的目的。请参阅@Jonas 的回答。
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
相关资源
最近更新 更多