c - Flatindexed 2D array - 垂直/水平翻转图像

标签 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;
}

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

我的垂直翻转功能也很困惑,生成的图像根本不像它应该的那样,所以我试图调试我在编写函数的逻辑中犯了错误的地方。

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

最佳答案

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

垂直翻转也有同样的问题。

您还存在索引问题。我假设 cols 表示列数,rows 表示行数。假设图像以行优先存储,这意味着平面数组中的布局是逐行排列,就像我们的读取顺序一样,那么第 i 行和 j 列的像素位于索引 cols*i+j ,而不是rows*i+j。不直观的是,cols 是列数,同时也是行的大小。祝调试愉快:)

关于c - Flatindexed 2D array - 垂直/水平翻转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297201/

相关文章:

r - 看似 protected 配对列表的垃圾收集

c - 在 C 中通过引用传递删除列表中的节点

javascript - 视差背景揭示了图像的边缘和它后面的内容

c++ - 处理二维数组的问题

c - 如何将 c 函数注入(inject)或动态加载到另一个 c 程序中

c - Fgets 在 C 编程中运行一次后被忽略?

html - 响应式定位图标

javascript - 如何跟踪缓慢的 JS 或 JQuery 代码

Python 按元素编号范围定义的步骤对 2D 数组求和

iphone - OpenGL ES 中的大滚动背景