【问题标题】:Image flipping incorrectly...Why?图像翻转不正确...为什么?
【发布时间】:2013-12-28 05:14:00
【问题描述】:

我试图在 Y 轴上翻转我的图像,它确实翻转了,但它在中间和右侧留下了奇怪的空间,它不会完美地翻转整个图像,我将图像限制为 450 450和一个P3...大家有什么想法,因为我的算法是正确的

for(j=0; j < imgur.width/2; j++)
  {
     for(i=0; i < imgur.height; i++)
        {
           temp.red = imgur.image[i][j].red;
           imgur.image[i][j].red = imgur.image[i][imgur.height-j-1].red;
           imgur.image[i][imgur.height-j-1].red = temp.red;

           temp.green = imgur.image[i][j].green;
           imgur.image[i][j].green = imgur.image[i][imgur.height-j-1].green;
           imgur.image[i][imgur.height-j-1].green = temp.green;

           temp.blue = imgur.image[i][j].blue;
           imgur.image[i][j].blue = imgur.image[i][imgur.height-j-1].blue;
           imgur.image[i][imgur.height-j-1].blue = temp.blue;
     }
  }

这是我的算法...在此之前我打印出 P3、注释、宽度和高度以及 maxColor。我正在使用两个结构来获取数据并从终端读取文件...... 这是我打印数据的方式。谁有想法?

 for(i=imgur.height-1; i >= 0; i--)
  {
     for(j=0; j < imgur.width; j++)
        {
           printf("%i\n", imgur.image[i][j].red);
           printf("%i\n", imgur.image[i][j].green);
           printf("%i\n", imgur.image[i][j].blue);
        }
  }

【问题讨论】:

  • 打印时翻页读取图片正常吗?你从最后一行读到第一行。
  • @Bentoy13 打印和扫描(我没有包括在内),我正在从第 0 列和第 0 行的最高点进行扫描和打印,并在打印/扫描数据时向下递增。我的目标是通过将右侧的像素移动到左侧来最终翻转图像。
  • 嗯,对我来说,图像的最高点位于image[0][0]。在这里,您可以在image[imgur.height-1][0] 开始打印。真的是你想做的吗?
  • @Bentoy13 因为我是从最高点移动,-1 这就是为什么我从高度 -1 开始,所以对于之前的每个像素,它都会翻转如下

标签: c image struct flip


【解决方案1】:

我的对称检测器被(在上半部分)弄糊涂了

for(j=0; j < imgur.width/2; j++) {
  for(i=0; i < imgur.height; i++) {

和(在下部)

for(i=imgur.height-1; i >= 0; i--) {
  for(j=0; j < imgur.width; j++) {

【讨论】:

  • 打印和扫描(我没有包括在内),我从第 0 列和第 0 行的最高点开始扫描和打印,并随着我打印/扫描数据而递减。但是我在算法本身中翻转了 for(j=0
【解决方案2】:

您在翻转算法中犯了一个小错误:当您上下翻转时,您必须完整扫描所有行和图像高度的一半,而不是反向。

for(j=0; j < imgur.width; j++)
{
  for(i=0; i < imgur.height/2; i++)
  {
     //code of your loop, removed for compactness
  }
}

编辑 实际上,对于左右交换,您还反转了索引j 的补码。 j沿X轴,属于0:width-1范围,所以补码为width-1-j

我很久以前就编写了这个算法的一个版本,是这样的:

for (i=0; i!=h; i++) {
    for (j=0; j!=w/2; j++) {
        temp = src[i][w-1-j];
        dst[i][w-1-j] = src[i][j];
        dst[i][j] = temp;
    }
}

我认为它工作正常(当您使用像素结构时,像这样交换整个像素是完全正确的)。

【讨论】:

  • 如果我在 Y 轴上翻转,我相信我是通过高度而不是宽度移动,最终像我向下一样翻转。
  • 如果沿 Y 轴翻转,则交换图像的左右部分。如果沿 X 轴翻转,则交换图像的顶部和底部。它与您扫描图像的方式并没有真正的关系。
  • 你如何定义 Y 轴和 X 轴?
  • 啊,我知道了。所以你的错误在for 语句中。我更正了我的答案;那么我的 cmets 就无关紧要了,抱歉。
  • 嘿!别担心,我很高兴能得到任何帮助!
猜你喜欢
  • 2017-07-16
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多