将图像旋转90度的算法? (没有额外的内存)
c
image-processing
5
0

在嵌入式C应用程序中,我有一张想要旋转90度的大图像。目前,我使用著名的简单算法来执行此操作。但是,此算法要求我制作该图像的另一个副本。我想避免为副本分配内存,我宁愿就地旋转它。由于图像不是方形的,因此很棘手。有人知道合适的算法吗?

编辑添加澄清,因为人们在问:

我以通常的格式存储图像:

// Images are 16 bpp
struct Image {
    int width;
    int height;
    uint16_t * data;
};

uint16_t getPixel(Image *img, int x, int y)
{
    return img->data[y * img->width + x];
}

我希望移动data数组的内容,然后交换widthheight成员变量。因此,如果我从9x20像素的图像开始,然后旋转它,则最终会得到20x9像素的图像。这改变了图像的步幅,这使算法非常复杂。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

如果您以“错误的顺序”从内存中读取图像,则其本质上与旋转图像相同。这可能不适合您正在做的任何事情,但是这里有:

image[y][x] /* assuming this is the original orientation */
image[x][original_width - y] /* rotated 90 degrees ccw */
image[original_height - x][y] /* 90 degrees cw */
image[original_height - y][original_width - x] /* 180 degrees */
收藏
评论

这可能会有所帮助: 就地矩阵转置

(如rlbond所述,您可能还需要在转置后进行一些镜像操作)。

收藏
评论

真正的答案:不,您不能不分配一些内存。

否则您必须使用递归,否则递归将无法处理大图像。

但是,有些方法所需的内存少于映像本身

例如,您可以获取点A(x从0到宽度,y从0到高度),计算它的新位置B,将B复制到它的新位置(C),然后再将其替换为A,等等。

但是,该方法将需要跟踪已移动了哪些字节。 (使用旋转图像中每个像素一位的位图)

请参阅Wikipedia文章,它清楚地说明了对于非正方形图像无法做到这一点:这是再次的链接: http : //en.wikipedia.org/wiki/In-place_matrix_transposition

收藏
评论

不确定旋转后将要执行的处理,但是您可以不理会它,而使用另一个功能从原始内存中读取旋转的像素。

uint16_t getPixel90(Image *img, int x, int y) 
{
    return img->data[(img->height - x) * img->width + y];
}

其中输入参数x和y已与原始尺寸交换尺寸

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号