Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 如何以亚像素精度转换图像?_Graphics_Image Processing_Rendering_Subpixel - Fatal编程技术网

Graphics 如何以亚像素精度转换图像?

Graphics 如何以亚像素精度转换图像?,graphics,image-processing,rendering,subpixel,Graphics,Image Processing,Rendering,Subpixel,我有一个需要在屏幕上移动图像的系统。我目前正在使用png,并将其放置在所需的屏幕坐标处 由于屏幕分辨率和所需帧速率的组合,一些帧是相同的,因为图像尚未移动完整像素。不幸的是,屏幕的分辨率是不可协商的 我对亚像素渲染如何平滑边缘有一个大致的了解,但我一直无法找到一个资源(如果存在的话)来说明如何使用着色将图像转换为少于一个像素的图像 理想情况下,这将适用于任何图像,但如果它仅适用于简单的形状,如圆形或环形,这也是可以接受的。亚像素插值相对简单。通常情况下,应用具有恒定相移的全通滤波器,其中相移对应

我有一个需要在屏幕上移动图像的系统。我目前正在使用png,并将其放置在所需的屏幕坐标处

由于屏幕分辨率和所需帧速率的组合,一些帧是相同的,因为图像尚未移动完整像素。不幸的是,屏幕的分辨率是不可协商的

我对亚像素渲染如何平滑边缘有一个大致的了解,但我一直无法找到一个资源(如果存在的话)来说明如何使用着色将图像转换为少于一个像素的图像


理想情况下,这将适用于任何图像,但如果它仅适用于简单的形状,如圆形或环形,这也是可以接受的。

亚像素插值相对简单。通常情况下,应用具有恒定相移的全通滤波器,其中相移对应于所需的亚像素图像偏移。根据所需的图像质量,您可以使用例如5点或其他带窗口的sinc功能,然后在一个轴或两个轴上应用该功能,具体取决于您是想要X偏移还是Y偏移或两者兼而有之

例如,对于0.5像素的偏移,系数可能是
[0.06645,0.18965,0.27713,0.27713,0.18965]
。(请注意,系数已归一化,即其总和等于1.0。)

要生成水平偏移,您需要将这些系数与从
x-2
x+2
的像素进行卷积,例如

const float kCoeffs[5]={0.06645f,0.18965f,0.27713f,0.27713f,0.18965f};
对于(y=0;y对于(dx=-2;dx,从概念上讲,操作非常简单。首先放大图像(根据需要使用任何插值方法),然后转换结果,最后将子采样缩小到原始图像大小

比例因子取决于要执行的亚像素平移的精度。如果要平移0.5度,则需要将原始图像放大2倍,然后将结果图像平移1像素;如果要平移0.25度,则需要放大4倍,依此类推


请注意,此实现效率不高,因为当您放大时,您最终计算的像素值实际上不会使用,因为当您将子采样恢复到原始图像大小时,像素值会被删除。Paul的答案中的实现效率更高。

我将对此进行测试,并让您知道它是如何进行的。谢谢,我希望这些人能够合作effs工作正常-我只是快速计算出来,没有测试它们-参考WikMedia页面了解Lanczos公式。系数加起来应该是1.0,所以你不需要缩放结果。当然,系数会根据你需要的亚像素偏移量而变化,如示例中所示,硬编码它们不会改变结果很好。像双三次曲线这样的简单公式也适用于此应用。@马克:是的,很好的观点-系数需要标准化。Lanczos和双三次曲线等的使用将取决于输出图像质量的要求。Paul,只要不涉及大小调整,Lanczos和双三次曲线之间的差异就不会太明显。我只是这么想。