图像处理:用于转换所需的上级(128x128像素)坐标的智能解决方案

时间:2008-11-24 13:55:07

标签: c++ visual-c++ image-processing

癌症CT图片存储在无符号短阵列(1维)内。

我有图片内部癌症区域的位置信息,但坐标(x,y)是超像素(128x128无符号短)。我的任务是突出这个地区。

我已经通过将超像素坐标转换为可以用于无符号短阵列的偏移来解决了这个问题。它工作正常,但我想知道是否有更聪明的方法来解决这个问题,因为我的解决方案需要3个嵌套的for循环。

是否可以“超像素”访问ushort数组,因此我可以在超像素中导航ushort数组。

我知道这不起作用。为了让你知道我在想什么:

typedef struct 
{
   unsigned short[128x128]
} 
spix;

spix *spixptr;

unsigned short * bufptr = img->getBuf();

spixptr = bufptr;

更新1:

是的,我的模糊,让我再试一次:

[0][1][2] ... [127]| ... [x] |
[1]                |         |
[2]                |         |
.                  |         |
.                  | <-- this is a superpixel
.                  |         |
[127]              |         |
--------------------         |
.                            |
.                            |
.                            |
[y]                          |<--whole picture stored in a ushort* buf = new ushort[x*y]
------------------------------

我喜欢使用指针一次访问128x128 ushorts,因此我可以memcpy将数据导入128x128字段。

更新2:

bitblit转移提示有很多帮助。

2 个答案:

答案 0 :(得分:1)

这很难回答,因为它很模糊。

如果你的意思是“我如何在给定图像定义的情况下在(x,y)处访问像素”,答案应该不是很令人惊讶:

typedef struct
{
    unsigned short data[128 * 128]; // This was broken in the question.
} spix;


void spix_set_pixel(spix *s, unsigned int x, unsigned int y, unsigned short value)
{
  s->data[y * 128 + x] = value;
}

根本不确定这是否能回答你的问题,但听起来似乎......似乎是合情合理的。

答案 1 :(得分:0)

据我所知,你有:

  • CT扫描的大图像
  • 该图像中的一个矩形区域,即癌症

然后它变得有点难以理解。我相信你想创建某种类,这样你就可以有效地访问图像的128x128块,就像它们是一个像素一样。

因此,如果图像为1024x1024像素,您希望能够将其作为128x128像素块的8x8网格进行访问。现在,如果是这种情况,您需要创建一个表示这些128x128块之一的类。这个类应该引用图像,这样你就不会复制图像数据,并且应该包含你想要在那个“超像素”上做的所有操作。

但是,如果您只想从较大的图像中提取出特定的128x128块,那么您需要的是bit blit算法。 bit block transfer(通常称为blit)将允许您将选定的数据位从较大的图像复制到较小的图像。该算法还可以适用于在较大图像中对特定区域执行几乎任何操作。

如果你需要一个blit,那么每个相对现代的图形API都应该有blit函数。