Tag: 插值

双线性插值

我得到了这个通过双线性插值来缩放图像的代码。我知道这有效但我无法弄清楚如果近似像素值是边缘(通过边缘,我的意思是它在最后一行或最后一列)像素输入图像然后我可以我gt坐标(x + 1,y + 1)的像素,这应该导致数组索引超出范围错误但没有出现这样的错误为什么? 代码是: public int[] resizeBilinearGray(int[] pixels, int w, int h, int w2, int h2) { int[] temp = new int[w2*h2] ; int A, B, C, D, x, y, index, gray ; float x_ratio = ((float)(w-1))/w2 ; float y_ratio = ((float)(h-1))/h2 ; float x_diff, y_diff, ya, yb ; int offset = 0 […]

根据步行速度在2个GPS位置之间插值

问题: 鉴于两个位置: L 1 =(纬度1 ,经度1 ,时间戳1 ) , L 2 =(纬度2 ,经度2 ,时间戳2 ) , 以及可配置但恒定的移动速度: v =每秒1.39米 (例如)。 我们如何在这两个位置之间进行插值以估算用户从L 1到L 2的位置 ? 我一直在寻找这个问题的解决方案,到目前为止我发现,对于小距离(远离极点),可以使用线性插值。 所以,我在维基百科上查找了线性插值 ,发现了这个: // Imprecise method which does not guarantee v = v1 when t = 1, // due to floating-point arithmetic error. float lerp(float v0, float v1, float t) { […]

GLSL着色器:在两个以上纹理之间插值

我在OpenGL中实现了一个高度图。 现在它只是一个正弦/余弦弯曲的地形。 此刻,我在白色“冰”和深色“石头”纹理之间进行插值。 这样做是这样的: color = mix(texture2D(ice_layer_tex, texcoord), texture2D(stone_layer_tex, texcoord), (vertex.y + amplitude) / (amplitude * 2)) 结果: 它工作正常,但如果我想添加更多纹理(例如草纹理),插值顺序为“冰,石,草”,我该怎么办? 我认为,没有像mix(sampler2D[], percentages[])这样的函数? 我怎么能按照这个逻辑写一个GLSL方法?

Java 2D加权数据插值

我正在尝试找到一些Java lib,代码示例(或起点)来帮助我弄清楚如何用权重插入2d点列表以生成带有水平曲线的插值。 谷歌搜索我发现有几种算法可以做到这一点,我找到了一些有趣内容的解释 。 我想尝试的第一个算法是反距离加权插值。 但有了这些信息,我有一些基本的疑虑: 要生成如下图所示的一张图片,我必须做一个像素矩阵(带有权重),插入数据,将像素组合在一起(按颜色范围)然后连接点确实绘制曲线并将参考文本值设置为这样 ? 如果我需要做这个像素矩阵,对于一个巨大的插值来说它会非常昂贵,那么我可以做更少的点并使用样条曲线来加入然后创建颜色级别吗? 示例数据: +——————-+ | X | Y | WEIGHT| +——————-+ | 2 | 5 | 30 | | 7 | 3 | 25 | | 1 | 1 | 10 | | 5 | 6 | 45 | | 7 | 9 | 15 | +——————-+ 示例规则: […]

如何在java中通过Bilinear Interpolation缩小图像?

我正在尝试读取图像,将其放大到80 * 60,然后通过双线性插值方法将结果图像缩小5次。 但我收到此错误:线程“main”中的exceptionjava.lang.ArrayIndexOutOfBoundsException:4800。 有人可以帮我吗? 这就是我所做的: import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.awt.image.WritableRaster; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; public class BiInterpolationTest { public static int zh; public static int zw; public static void main(String[] args) throws IOException { // TODO Auto-generated method stub […]

在已知的缺失时间间隔之间插值3D坐标

数据是空间中的路径。 我有3D位置数据(x,y,z)和记录位置点的时间。 x,y和z坐标是穿过3D Space的物体的点位置。 时间值是记录每个点的时间(从0开始)。 xyz time(s) 0.1 2.2 3.3 0 2.4 2.4 4.2 0.3 4.5 2.5 1.8 0.6 我最终会错过一些录音活动。 (这是已知的并且被接受为真)并且数据流将以不同的时间间隔继续: xyz time(s) 0.1 2.2 3.3 0 2.4 2.4 4.2 0.3 //missing x,y,z data point at time 0.6 //missing x,y,z data point at time 0.9 4.5 2.5 1.8 1.2 … … 请注意,数据已经简化。 我的目标是在已知的丢失时间内插入缺失的3D点。 我已经研究了各种插值技术,但我不完全确定哪种插值方法适合我的问题。 1)有人可以简洁地解释这是什么问题吗? […]

数组插值

在我开始之前,请接受我的道歉,我不是一名数学家,并且我真的不知道我正在尝试做什么的正确名称…;)指向可能有帮助的任何简单英语解释赞赏(因为我现在基于我认为解决方案可能是纯粹的谷歌搜索)。 如果有一个多维的源值数组并希望将该数组放大n倍,我认为我需要使用的是双立方插值当然,该页面右上方的图像代表了我的意思旨在 – 根据周围邻居的价值在基础源数据点之间创建渐进的价值流。 我完全接受通过不增加数据量而不是增加数据的分辨率; 只是模糊边缘。 类似于此事的东西; 对此(及以后); 在维基百科文章中的链接之后给了我一个(假设的)我正在努力的实例 ,但是如果确实如此,我担心我现在错过了让自己在那里的逻辑飞跃。 当我在BicubicInterpolator上调用getValue(source,0.5,0.5)时,我又回来了什么? 我想如果我给出(0.0,0.0)的x / y,我会回到网格的左下角值,如果我看(1,1),我会得到右上角,并且之间的任何值都会给我在插值网格内的指定位置。 double[][] source = new double[][] {{1, 1, 1, 2}, {1, 2, 2, 3}, {1, 2, 2, 3}, {1, 1, 3, 3}}; BicubicInterpolator bi = new BicubicInterpolator(); for (double idx = 0; idx <= 1; idx += 0.1) { LOG.info("Result (" + […]

旋转BufferedImage时如何产生清晰的绘画效果?

一种尝试的方法是使用TexturePaint和g.fillRect()来绘制图像。 然而,这需要您在每次绘制图像时创建一个新的TexturePaint和Rectangle2D对象,这是不理想的 – 并且无论如何都没有帮助。 当我使用g.drawImage(BufferedImage,…) ,旋转的图像看起来模糊/柔和。 我熟悉RenderingHints和双缓冲(我认为这就是我正在做的事情),我发现很难相信你不能轻易有效地在Java中旋转产生尖锐结果的图像。 使用TexturePaint代码看起来像这样。 Grahics2D g2d = (Graphics2D)g; g2d.setPaint(new TexturePaint(bufferedImage, new Rectangle2D.Float(0,0,50,50))); g2d.fillRect(0,0,50,50); 我正在使用AffineTransform将一手牌旋转成一个风扇。 什么是快速绘制好看图像的最佳方法? 这是一个截图: 9是清脆的,但其余的卡肯定不那么尖锐。 问题可能出在我创建每张卡片图像并将其存储在数组中时。 这就是我现在正在做的事情: // i from 0 to 52, card codes. … GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); BufferedImage img = gc.createCompatibleImage(86, 126, Transparency.TRANSLUCENT); Graphics2D g = img.createGraphics(); setRenderingHints(g); […]

按位操作 – 如何更改现有颜色?

我已经阅读了按位运算符(&| ^),我理解如果我这样做: alpha = 0xFF000000 >> 24 ; blue = 0xFF0000FF & 0x000000FF; red = 0xFFFF0000>>16 & 0x000000FF; green = 0xFF00FF00>>8 & 0x000000FF; 然后,我可以掩盖其他颜色,只有红色或蓝色(等…)组件,如果我这样做 int color = alpha | blue | red | green; 然后我再次重新构建颜色可以这么说。 我很好奇的是如果我想在Java中用两种颜色之间创建双线性插值。 我该怎么做呢? 我想从标准绿色(0xFF00FF00)开始,以黑色(0xFF000000)结束,中间的颜色将从绿色变为深绿色,直到最终变为黑色。 我认为我必须做一些事情,我创建一个bufferedImage,从顶部开始绿色,然后可能创建一个for循环,它将读取前一个像素的颜色,然后移动一些东西,直到以前的颜色的新版本是创建等等。 不幸的是,我不确定如何实现这一点,因为我理解按位运算和理论上的转变,但我不确定如何将它们用于此目的。 任何帮助将不胜感激! 先感谢您!

数组插值(或两个)

我正在寻找一个java库或一些帮助来编写我自己的插值函数。 那是我有两个双打数组,可能有不同的大小,但是有序。 我需要能够估计中间值,并插入以使两个数组的大小相同。 事实上,插值中出现的点总数是2个数组大小减1的总和。但是,每个数组的范围必须保持不变,因此不需要外推。 例如。 a1 = [1,4,9,16,25,36]和a2 = [6,9,14,30] 结果可能是例如。 a1 = [1,2.25,5,2.65,9,12.25,16,25,36]和a2 = [6,6.5625,7.25,9,10.2625,11.25,14,25.25,30] 这些例子是f(x) = x^2 and g(x) = x^2 + 5 ,但是很容易就是任何多项式 – 这一点是能够从数据集中很好地估计/近似函数来提供足够的插值。 这里的x值只是输入数组的索引。 在输出中,只有y值很重要。