我写了一些代码来尝试回答这个问题。
我已经获得了一个绘制图像的程序,使用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数组值。
答案 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;
}
这段代码可以提高效率,但基本上我所做的是将交换操作的次数减半,并且我在交换操作期间引入了一个临时变量来保存数据。