问题标签 [bicubic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4056 浏览

c++ - 双三次图像大小调整算法

我一直在尝试学习图像大小调整算法,例如最近邻、双三次和双线性插值算法。我对数学进行了一些研究,现在我正在研究现有的实现以了解和欣赏它们的工作原理。

我从使用 OpenCV 并提供测试和示例代码的 Google 代码中找到的 Bi-Cubic Resize 的实现开始。我用它作为我自己的实现的起点,它不使用 OpenCV,而只是对包含在一个原始位图上进行操作std::vector<unsigned char>



现在,据我所见,这个实现存在致命缺陷,因为这行:



在我看来,当is时,这条线总是会访问越界的数组索引。并且将始终是初始值,因为 y 是用 初始化的,并且是一个从 开始的迭代器变量。因此,由于将始终从 开始,因此表达式(用于计算 ARRAY INDEX)将始终为负数。而且......显然,负数组索引是无效的。y0y0y = ty * ii0y0(y - 1 + jj) * bytes_per_row + (x - 1) * components + k

问题:在我看来,这段代码不可能工作。我错了吗?

0 投票
4 回答
27925 浏览

c++ - 用于图像缩放的双三次插值算法

我正在尝试编写一个基本的双三次调整大小算法来调整 24 位 RGB 位图的大小。我对所涉及的数学有一个大致的了解,并且我使用Google Code 中的这个实现作为指导。我在这里没有使用任何外部库——我只是在试验算法本身。位图表示为普通的std::vector<unsigned char>

问题:当我使用此算法缩小图像时,除了输出图像由于某种原因在右侧包含所有黑色像素外,它可以工作,看起来它已被“裁剪”。

例子:

输入图像:

在此处输入图像描述

输出图像:

在此处输入图像描述

问题查看算法,我不明白为什么会发生这种情况。有人看到这里的缺陷吗?

0 投票
0 回答
437 浏览

java - 与 Scalr (JAVA) 相比,使用 GD 放大图像的质量较差

我一直在处理非常小的图像,并试图找到增加它们的最佳方法。我比较了两个不同的来源:imagecopyresampled(PHP:http : //www.php.net/manual/en/function.imagecopyresampled.php)与 Scalr(JAVA:如何调整目录中的图像大小?)。为了完整起见,我在下面包含了我使用的代码,但它们强烈基于上面引用的其他线程或站点。如果有人认为我应该删除,我会这样做!在这两个来源中,用于处理该问题的算法似乎是相同的:双三次插值。然而,在 JAVA 源代码的情况下,在我的实现中,调整大小图像的质量要好得多(甚至无法比较)。当我使用 PHP 源代码时,我做错了吗?如果没有,有人可以解释一下它们之间的区别吗?

Java代码:

PHP代码:

为了清楚起见,在 JAVA 代码中,我必须将图像保存在一个文件夹中。在 PHP 代码中,我提供了文件的名称。当然,我比较了完全相同的图像。此外,这两个代码都在运行,没有任何问题。

![PHP 与 Java(按此顺序)]:http ://www.facebook.com/media/set/?set=a.122440714606196.1073741825.100005208033163&type=1&l=55d93c4969

0 投票
1 回答
248 浏览

interpolation - 双三次插值中的“t”是什么?

我正在阅读维基百科上的双三次插值。我遇到了t未定义的变量。

方程是:

在此处输入图像描述

谁能告诉这个变量的含义以及它的通常值是什么?

0 投票
1 回答
1942 浏览

java - 使用双三次插值缩放 2D 阵列

我想将任意缩放到具有不同尺寸double[][]的另一个。double[][]应使用双三次插值基于输入数组计算结果数组的值。

我知道这已经在图像处理中完成了几十年,但是我找不到适用于任何二维数组而不是某些特定图像对象的库或至少一个工作代码片段,所以这就是我在这里问的原因。

更具体的要求:

据我了解,可以使用双三次插值直接计算 3x3 网格角之间的任何点的值,所以我需要的第一个函数类似于

其中 x 和 y 介于 0.0 和 1.0 之间

下一步当然是简化这个过程,以便为每个点自动选择 3x3 网格,我可以得到类似的东西

这将为我提供一个具有指定尺寸但与输入数组具有相同边框的新数组。

我真正想要得到的是:

最小值和最大值定义了一个边界框,因此我可以获得初始数组的子集,它不一定需要在输入数组的确切索引值处开始或结束(例如,角可以在 (5,3) 或(5.25, 3.7),所以你不能只在某个索引值处切断输入数组)。这个边界框将成为新数组的范围,并且值是从输入数组中插入的。

哦,仅供参考:这是关于数字高程模型,所以请告诉我我的方法是否完全错误;)

0 投票
1 回答
4871 浏览

c++ - 双三次调整大小的实现

我一直在尝试为内存位图编写 Bi-Cubic 调整大小算法。我熟悉双三次插值的工作原理,并且我使用了Wikipedia 文章现有实现作为编写自己版本的指南。

以下是我的简单实现。在这里,bmap是一个vector包含位图数据get_subpixel的函数,它只是一个将位图视为由X x Y x Channel像素组成的 3D 数组并返回指定坐标处的单个子像素的函数。

此代码适用于某些目标大小。例如,如果原始位图为500 X 366,而目标大小为250 x 183,则该算法完美运行:

原件:
在此处输入图像描述
调整大小
在此处输入图像描述

但是,对于某些其他目标大小,例如100 x 73,目标图像会失真:
在此处输入图像描述

我一直在检查插值代码,但我看不出我做错了什么。

我会很感激任何提示、建议或答案。

0 投票
2 回答
3795 浏览

performance - GLSL 性能 - 函数返回值/类型

我正在使用双三次过滤来平滑我的高度图,我在 GLSL 中实现了它:

双三次插值:(interpolate()下面的函数)

这是我的版本,纹理大小(1025)仍然是硬编码的。在顶点着色器和/或曲面细分评估着色器中使用它会严重影响性能(20-30fps)。但是当我将此函数的最后一行更改为:

就像我使用双线性或最近/不过滤一样,性能会提高。

同样的情况发生在:(我的意思是性能仍然很好)

插值函数:

仅当我返回最终H_iy值时,fps 才会降低。返回值如何影响性能?

编辑我刚刚意识到我doubleinterpolate()函数中使用了声明c1c2...等。我已将其更改为float,现在性能仍然很好,返回值正确。所以问题有点变化:

精度变量如何double影响硬件的性能,为什么其他插值函数没有触发这种性能损失,只有最后一个,因为H_ix[]数组float也是,就像H_iy

0 投票
4 回答
11201 浏览

c# - Bicubic Interpolation?

I looked through the internet, and in terms of Bicubic Interpolation, I can't find a simple equation for it. Wikipedia's page on the subject wasn't very helpful, so is there any easy method to learning how Bicubic Interpolation works and how to implement it? I'm using it to generate Perlin Noise, but using bilinear interpolation is way to choppy for my needs (I already tried it).

If anyone can point me in the right direction by either a good website or just an answer, I would greatly appreciate it. (I'm using C# by the way)

0 投票
1 回答
2026 浏览

html - 双三次插值图像重采样

我的网站上有一个 900 像素宽的徽标标题图像,它适合一个容器,可以将其缩小以适合标题栏;原因是为适合标题栏而创建的图像在高分辨率移动设备上看起来很糟糕。

我发现我的图像在 chrome 中看起来非常好,但在 IE10 中它看起来令人震惊。你自己看; www.cmvisual.com

我已经尝试使用 -ms-interpolation-mode:bicubic 代码来尝试解决这个问题,但它似乎不起作用(快速浏览 ms 网站说它已经过时了?)。

这是我的代码:

我是否遗漏了什么,有人对如何解决这个问题有任何建议吗?我考虑过可能包含标签以在不同设备上显示不同版本的图像,但这似乎很耗时并且是一种廉价的解决方法?

非常感谢任何花时间提供帮助的人。

0 投票
1 回答
2513 浏览

c++ - 双三次插值伪影(图像放大)

我正在使用双三次插值算法来放大高度图,并且我注意到像素边界周围的一些伪影。但是,当我使用简单的三次插值(样条)时,这些伪影似乎不会出现。

可能是因为双三次插值不能保证二阶导数是连续的,不像三次样条?如果是这样,是否存在具有连续二阶导数的已知算法?否则,有没有办法处理这些文物?

线性插值(显示像素边界): 线性插值

双三次插值(在像素边界处可见伪影): 双三次插值

三次插值(没有明显的伪影): 在此处输入图像描述

我尝试了几个双三次公式,得到了相同的结果。这里有些例子:


编辑:我做了一些搜索,发现 B-Spline 有一个连续的 C2(也是 Bharat 建议的)。我实现了它,它看起来很好,即使它是一个近似值而不是插值(它不通过样本)。

B样条(近似): b样条