用于填充图像阵列的逻辑

时间:2011-02-02 22:45:40

标签: c image padding

PLS。请注意,这不是任何家庭工作问题,而是我正在做的工作以及需要一些指示的地方。

我有一个2D图像存储在一维数组(行主要顺序)。我需要填充此图像,复制边框像素,顶部填充1行,底部填充1行,填充到右边1列,图像左边1列。我试图在C代码中执行此操作。

e.g。将1D阵列中的2D图像视为img [],如下所示。实际图像的大小为3x4(4行3列),并且在两个方向(向上/向下/向左/向右)上填充1行和1列之后,最终图像的大小为5x6(6行,5列)。

int img[30] = {0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,10,11,12,0,0,0,0,0,0};

在我的情况下,填充的大小是已知的,在顶部和底部只有1行,图像的右侧和左侧是1列。因此,实现此目的的一种方法是通过在给定图像阵列中的像素的索引与填充的输出像素索引之间创建映射。我将此映射存储在预先计算的查找表中,并在填充逻辑中使用该表。

填充后,输出应如下所示:

int img[30] = {1,1,2,3,3,1,1,2,3,3,4,4,5,6,6,7,7,8,9,9,7,7,8,9,9};

我创建的查找表是: -

int lut[6,6,7,8,8,...];

并按如下方式使用此表:

for(i=0;i<30;i++)
{
img[i] = img[lut[i]]; //something on this lines...
}

但我感兴趣的是以编程方式实现这种图像填充逻辑比使用基于查找表的方法。即我想在运行时计算代码中的像素索引。 编辑:此外,我还需要获取填充图像(在相同的缓冲区中,其中可以为附加的填充行/列提供存储空间)。

任何指针代码会是什么样的。

谢谢。

-AD

2 个答案:

答案 0 :(得分:4)

#include <stdio.h>

void pad_image(int* img, int cols, int rows)
{
    for( int i = 0 ; i < cols ; ++i )
    {
        // top and bottom
        img[i]               = img[i+cols];
        img[i+cols*(rows-1)] = img[i+cols*(rows-1)-cols];
    }
    for( int j = 0 ; j < rows ; ++j )
    {
        // left and right
        img[j*cols]        = img[j*cols+1];
        img[j*cols+cols-1] = img[j*cols+cols-2];
    }
}

int main( int argc, char** argv )
{
    int img[30] = {0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,10,11,12,0,0,0,0,0,0};
    for( unsigned int i = 0 ; i < 30 ; ++i )
       printf("%d ",img[i]);
    printf("\n");
    pad_image(img,5,6);
    for( unsigned int i = 0 ; i < 30 ; ++i )
       printf("%d ",img[i]);
    printf("\n"); 
}

答案 1 :(得分:3)

由于您的图像已经位于目标数组中的正确位置,因此相当简单 - 您不必在数组中移动任何数据,只需将其复制即可。

使用填充大小调用以下函数(例如pad_image(img, 5, 6);)。它迭代填充的行,填充第一列和最后一列;然后复制填充的第一行和最后一行。

#include <string.h>

void pad_image(int img[], int n_cols, int n_rows)
{
    int row;

    if (n_cols < 3 || n_rows < 3)
        return;

    for (row = 1; row < (n_rows - 1); row++)
    {
        /* Duplicate first column in this row */
        img[row * n_cols] = img[row * n_cols + 1];
        /* Duplicate last column in this row */
        img[row * n_cols + n_cols - 1] = img[row * n_cols + n_cols - 2];
    }

    /* Duplicate first row */
    memcpy(&img[0 * n_cols], &img[1 * n_cols], n_cols * sizeof img[0]);
    /* Duplicate last row */
    memcpy(&img[(n_rows - 1) * n_cols], &img[(n_rows - 2) * n_cols], n_cols * sizeof img[0]);
}