基本插值、放大和缩小

发布于 2024-12-24 20:38:09 字数 229 浏览 1 评论 0原文

我有二维数组,它是单色图像的解释。我想将其调整为特定的已知尺寸。质量并不重要。 如果我需要将其调整为 2 倍或 4 倍大小,也可以,只需使用最近邻插值,例如放置 4 个像素而不是 1 个像素。 基本上,如果我需要将图像插值到 x1.5,我会将尺寸增加 x3 并减小 x2。我说得对吗? 但是,例如,当我需要将图像放大到 3 倍大小时,我该怎么办? 那么,像素应该如何放置在插值数组中? 如果您能提供任何信息、代码、其他网站的链接,那就太好了。

I have 2-dmensional array, it's an interpretation of a monochrome image. I'd like to resize it to specific, known size. The quality is not essential.
If I need to resize it to 2x or 4x size, it's okay, just using the nearest neighbor interpolation, placing 4 pixels instead of one for example.
Basically, if I need to interpolate my image to x1.5, I'll increase the size x3 and decrease it x2. Am I right?
But what should I do, when I need to enlarge my image to 3x size, for example?
How should be pixels placed then, in an interpolated array?
It would be great if you give any info, codes, links to other sites.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

獨角戲 2024-12-31 20:38:09

诀窍是以相反的方式思考:不要尝试将源图像的像素放入缩放图像中,而是在源图像中找到应放入缩放图像中的像素。

它看起来像这样:

float scaleFactor = 3.0f;

for (int y=0; y < scaledImageHeight; y++)
  for (int x=0; x < scaledImageWidth; x++) {
    int sourceImageX = (int)std::max(x * 1.0f / scaleFactor, (float)(sourceImageWidth - 1));
    int sourceImageY = (int)std::max(y * 1.0f / scaleFactor, (float)(sourceImageHeight - 1));
    scaledImage[y * scaledImageWidth + x] = sourceImage[sourceImageY * sourceImageWidth + sourceImageX];
  }

出于演示目的,此代码将图像固定在右下角,因此程序不会因为数组溢出而崩溃(这就是 std::max 的用途)。

The trick is thinking the opposite way: Don't try to place a pixel of the source image into the scaled image, but find a pixel in the source image that should be placed into the scaled image.

It would look something like that:

float scaleFactor = 3.0f;

for (int y=0; y < scaledImageHeight; y++)
  for (int x=0; x < scaledImageWidth; x++) {
    int sourceImageX = (int)std::max(x * 1.0f / scaleFactor, (float)(sourceImageWidth - 1));
    int sourceImageY = (int)std::max(y * 1.0f / scaleFactor, (float)(sourceImageHeight - 1));
    scaledImage[y * scaledImageWidth + x] = sourceImage[sourceImageY * sourceImageWidth + sourceImageX];
  }

For demonstration purposes this code clamps the image on the lower right, so the program doesn't crash because of an array overrun (that's what the std::max is for).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文