#1 楼
本质上,图像是一组点样本(读取的像素不是一点正方形3)。变换或缩放图像时,需要对其重新采样。因此,从理论上讲,您要做的就是获取点样本并将其转换为连续函数。然后,您对该连续函数进行采样并重建信号。因此,这里有两个或三个不同的阶段。将样本转换为连续函数(函数重构)。
(转换)
重新采样信号
请注意,这些步骤均没有固定形式。在实践中,如果进行了优化,就不可能说有步骤。变换并非一定很简单,可以将形状映射为螺旋形等。
图像1:由不同滤波器重构的一维信号。
实际上,在信号处理领域中有关信号重构的知识很多。设计这些过滤器并选择合适的过滤器本身就是一种艺术形式。但是,从本质上讲,滤波器的选择是在模糊和振铃之间进行权衡。当然,该算法还具有其他质量,例如执行多少指令,需要多少速度以及需要多少内存等。这在实时或嵌入式应用程序中非常重要。
图像2:整个过程的概述。
#2 楼
有许多放大和缩小算法可用于将图像从任何分辨率缩放到任何其他任意分辨率。每种算法通常都涉及效率,平滑度和清晰度之间的折衷,对于不同算法,每种折衷的程度各不相同。查阅此Wikipedia文章,了解此类算法和此类算法的示例。
最流行(和最常用)的算法是Bicubic插值算法。它在矩形网格的2D点之间进行插值。使用三次样条曲线(或三次插值),它首先在一个维度上进行插值(查找被插值的行/列),然后在另一维度上进行插值。
双线性插值类似于Bicubic插值,除了前者使用线性函数进行插值并且只能在两个值之间进行插值,而后者使用三次函数并且可以在四个值之间进行插值。
Bicubic插值的简单函数如下:
f(f(p00, p01, p02, p03, y),
f(p10, p11, p12, p13, y),
f(p20, p21, p22, p23, y),
f(p30, p31, p32, p33, y),
x)
其中(x,y)是插值位置,p [] []是表示4 * 4网格的2d数组。
检查此链接以获取更多信息和示例代码,这确实有很大帮助!
#3 楼
尽管给出的其他答案是正确的,但我不确定它们是否能完全回答您的问题。为了避免出现黑条,如果目标与源的形状(或长宽比)不同,则有2个选项:填充目标并留下一些像素从源头到目的地。在您的示例中,源为1024x768,目标为1920x1080。如果按比例放大原始图像,使结果为1920x1440,则可以裁剪顶部和/或底部以使其达到1920x1080。因此,您可以垂直缩放1080/768 = 1.40625,水平缩放1920/1024 = 1.875。这几乎从来不是您想要的,并且在大多数情况下看起来很糟糕。 (这是使人看起来比实际情况要宽得多的原因,它使圆圈变成椭圆形,并将旋转变成剪子。)直到1维与目标一样大。在这种情况下,您将水平和垂直缩放1.40625以获得1440x1080的结果。通常将其称为“缩放以适合”。
对于任何这些选项,您都可以使用满足您需求的任何缩放算法。
评论
$ \ begingroup $
你也可以有白条。您还可以使用某些图像合成功能来填充像素,您可以在图像上叠加一个被裁剪的图像和一个可以拉伸的图像。这只是无数种无数据处理方式。我认为我们大多数人只是假设其规模将是不均匀的。
$ \ endgroup $
– joojaa
16年5月6日在8:23
$ \ begingroup $
非常正确。我以为原始海报专门不想用纯色填充,并且只对缩放方面感兴趣,因为这就是他们所要求的。但是还有许多其他填充方法。还有一些非线性缩放方法,例如,中心保持其长宽比,并拉伸边缘。
$ \ endgroup $
–user1118321
16年5月6日15:44
评论
有诸如三次三次缩放之类的缩放算法,当缩放到任何大小时,它们会使用样条线近似像素的颜色。@EvilTak,可以将您的评论扩展成一个小答案吗?
@glampert做到了。您要我删除我的评论吗?
@EvilTak,我想你可以离开它。顺便说一句,谢谢!