Flatindexed 2D阵列 - 垂直/水平翻转图像

时间:2016-03-29 23:54:23

标签: c image 2d

我写了一些代码来尝试回答这个问题。

我已经获得了一个绘制图像的程序,使用X11缩放灰度。

我被要求编写一个水平/垂直翻转图像的功能。

这是我的代码段

// flip the image, left-to-right, like in a mirror.
void flip_horizontal( uint8_t array[], 
              unsigned int cols, 
              unsigned int rows )
{

  int i;
  int j;
  for (i=0; i<rows;i++)
  {
    for (j=0; j<cols;j++)
      {
       array[rows*i+j]=array[rows*i+(cols-1-j)];
      }
  }
}

// flip the image top-to-bottom.
void flip_vertical( uint8_t array[], 
            unsigned int cols, 
            unsigned int rows )
{

int i=0;
int j=0;
  for (i=0; i<rows;i++)
  {
    for (j=0; j<cols;j++)
      {
       array[rows*i+j]=array[rows*(rows-1-i)+j];
      }
  }
  return;
}

我遇到的问题是我的水平功能只翻转图像的一半,另一半保留其原始值。

我的垂直翻转功能也是一团糟,所产生的图像看起来并不像它应该如此,所以我试图调试我在逻辑中犯了错误的地方写这些功能。

我使用平面索引方法来访问2D数组值。

2 个答案:

答案 0 :(得分:2)

在水平翻转中,内部循环遍历所有列并为像素分配其镜像值。让我们说你最左边的像素是100,最右边的像素是23.一步之后,最左边的像素变为23.现在当它到达最右边的一个时,它试图看最左边的一个,中提琴,你得到23再次。值100已经丢失。这就是为什么你的右半部分图像不会改变的原因。

垂直翻转的问题相同。

此外,您还有索引问题。我假设 cols 表示列数,表示行数。假设图像存储为row-major,意味着平面数组中的布局是逐行的,就像我们的读取顺序一样,那么第i行和第j列的像素位于索引 cols * i + j 而不是 rows * i + j 。毫不直观地, cols 是列数,同时是行的大小。快乐的调试:)

答案 1 :(得分:-1)

static uint8_t temp;

void flip_horizontal( uint8_t array[], 
              unsigned int cols, 
              unsigned int rows )
{

  int i;
  int j;
  for (i=0; i<rows/2;i++)
  {
    for (j=0; j<cols;j++)
      {
       temp=array[rows*i+j];
       array[rows*i+j]=array[rows*i+(cols-1-j)];
       array[rows*i+(cols-1-j)]=temp;
      }
  }
}

// flip the image top-to-bottom.
void flip_vertical( uint8_t array[], 
            unsigned int cols, 
            unsigned int rows )
{

int i=0;
int j=0;
  for (i=0; i<rows;i++)
  {
    for (j=0; j<cols/2;j++)
      {
       temp=array[rows*i+j];
       array[rows*i+j]=array[rows*(rows-1-i)+j];
       array[rows*(rows-1-i)+j]=temp;
      }
  }
  return;
}

这段代码可以提高效率,但基本上我所做的是将交换操作的次数减半,并且我在交换操作期间引入了一个临时变量来保存数据。