帮助2D阵列算法

时间:2011-02-27 01:41:32

标签: c arrays algorithm multidimensional-array

我正在制作一个以最佳方式将两个图像组合在一起的程序。假设我有两个包含构成这两个图像的“像素”结构的二维数组。

我已经编写了确定 where 的算法,将图像连接起来,相对于“x”和“y”两个图像中较大的一个,其中x是列和y是较大图像的2D数组的行。它们应该连接的点被封装在一个“匹配”结构中,如下所示:

typedef struct {
    int overlap;       // used in algorithm to determine where to combine
    int x;             // column of larger image
    int y;             // row of larger image
    int overlapWidth;  // width of the overlap between the two images
    int overlapHeight; // height of the overlap between the two images
} match;

请注意,相对于较大的图像,匹配点可能为负(x,y或两者)。

重叠中包含的像素是平均的,两个图像之外的任何像素(但仍在新维度内)都是白色的。

示例

 +---+---+ image1
 |   |   |
 +---+---+---+ image2
 |   | X |   |
 +---+---+---+
     |   |   |    
     +---+---+

X表示这两个图像的匹配点,因此其状态如下所示:

x = 1
y = 1
overlapWidth = 1
overlapHeight = 1

此案例的新图片为3x3。

假设我有“匹配”将两个图像连接在一起,计算得到的图像的新宽度和高度,以及根据这些新尺寸为结果图像分配的2D数组,I我想知道如何将适当的像素放入新图像中。下面是一些代表我正在尝试做的伪代码。

伪代码

FOREACH row in new_height
    FOREACH col in new_width
        IF larger_image AND smaller_image do not contain (row,col)
            add white pixel
        ELSE IF overlap contains (row,col)
            add average of pixels
        ELSE IF only larger_image contains (row,col)
            add larger_image pixel
        ELSE
            add smaller_image pixel

我很难想出办法来做到这一点。我不一定在寻找代码,我只是在寻找关于如何做我正在谈论的事情的想法。任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的伪代码看起来是正确的。您是否只是将其翻译成C?

首先,您的伪代码使用单词“add”,这意味着像素被放入一些新数组,但它没有指定此数组的来源。所以请允许我稍微扩展你的伪代码:

Create a new_image
FOREACH row in new_height
    FOREACH col in new_width
        IF larger_image AND smaller_image do not contain (row,col)
            in new_image, set (row,col) to white pixel
        ELSE IF overlap contains (row,col)
            in new_image, set (row,col) to average of pixels
        ELSE IF only larger_image contains (row,col)
            in new_image, set (row,col) to larger_image pixel
        ELSE
            in new_image, set (row,col) to smaller_image pixel

现在的问题是“不包含(row,col)”。图像不包含特定坐标是什么意思?这意味着(row,col)坐标位于源图像中的空间之外。我认为如果你在新的图像空间中编写一个带有图像(大或小)和match结构以及(行,col)坐标的函数,它会有所帮助,并返回相应的像素来自源图像,或表示该像素不在该图像中。 (在C中,你可以通过让函数返回一个int来实现这个,如果有一个像素则为1,如果没有则返回0,并且有一个参数是指向你填写的像素的指针,如果你要返回1。)

现在你可以问这个函数big_image和small_image是否包含(row,col),还可以从每个像素中获取像素(如果有),并应用你的四种不同情况。

答案 1 :(得分:1)

要检查(row,col)所属的图像,您可以使用此算法。我需要有大小图像的大小;因此额外的参数。

INPUT: row, col, match, big, small
if match.x < 0 then
    // offset of big image, in case small one is to the left
    offsetx <- -match.x
if match.y < 0 then
    // offset of big image, in case small one is above
    offsety <- -match.y
if offsetx <= col and col < offsetx + big.width then
    if offsety <= row and row < offsety + big.height then
        hitBig <- true
        coordBig <- (col - offsetx, row - offsety)
if offsetx + match.x <= col and col < offsetx + match.x + small.width then
    if offsety + match.y <= row and row < offsety + match.y + small.height then
        hitSmall <- true
        coordSmall <- (col - offsetx - match.x, row - offsety - match.y)
return hitBig, coordBig, hitSmall, coordSmall

所有坐标都相对于新图像。如果小图像在上方和左侧,则它将在新图像中为(0,0),并且向下和向下按下大图像。