Home › Forums › GAMES在线课程(现代计算机图形学入门)讨论区 › 关于双线性插值的实现问题
- This topic has 27 replies, 8 voices, and was last updated 1 year, 4 months ago by Eipi.
-
AuthorPosts
-
-
请问一下我这样的实现思路是对的吗
我的主要想法可以参考图1,auto u_img = u * width; auto v_img = (1 - v) * height;
在这之后,因为u_img和v_img是float,可能不是刚好处于某个texel(纹素)的位置,纹素的位置我猜测如果是用默认那个1024X1024的贴图的话,横坐标和纵坐标的范围应该都是0~1024的整数吧,每一个(i,j)都代表一个纹素
所以我做了个四舍五入,让它取到最近的一个纹素坐标上(这里我假设纹素的坐标指的是纹素左下角的位置,这个是根据之前老师对像素坐标讲解而推测出来的,如果有误,欢迎批评指出!)
也就是float u_img_round = round(u_img); float v_img_round = round(v_img);
具体见附录图1
然后就是取四周的四个纹素的中心,也就是1、2、3、4,对点p进行双线性插值,具体插值方法就是老师上课讲的,先计算p的横坐标在0、1之间的占比,计算由上边和下边混合的颜色,然后计算p的纵坐标在0、2之键的占比,计算“之前已经算出的混合颜色”的混合
lerp的话就是自己实现的,就是用百分比,比如设占比是c,结果是a*c+b*(1-c)
请问一下我这样的思路有什么问题吗
因为我实现出来的结果不尽人意,虽然有模糊的效果了,但是边缘变得毛毛糙糙的,具体见附录图2、3,2是不用双线性的,3是用双线性的This post has received 1 vote down.- This topic was modified 4 years, 8 months ago by 戴皓天.
Attachments:
You must be logged in to view attached files. -
顺便问一句
image_data.at<cv::Vec3b>(v,u)
这个cv::mat.at()它内部是已经做了一个四舍五入了吗,因为原getColor()函数是直接传一个float值进去的-
你可以看一看他的参数类型是int,所以不是四舍五入,直接小数部分舍去了
-
好的谢谢!
-
-
-
看图你是把 round 完的结果当原点位置算?那你的结果不都是中间值了吗。。。
-
是的我就是这个意思。。。但是双线性插值不是就是这个意思吗,对于低分辨率的贴图为了避免锯齿所以要根据插值取周围的颜色模糊一下,所以按这么说的话所有结果都应该是插值后的值,也就是中间值。。不知道我的理解是否有误
-
是要找周围的颜色,但应该是根据原点的位置算距离从而作为权重进行混合。
所以你不能用舎入后的值当原点位置算,那你的结果肯定不对。至于说舍入后的点是四个点中的哪个其实无所谓,这只是相对位置
-
我不知道大佬你有没有理解我的意思,我主帖可能说的不清楚,我取四舍五入取到某个整数坐标点是为了方便找四周的点,举个例子,也就是我主帖的图一,因为p离p撇最近,所p需要对p撇四周的纹素进行插值混合,这时候就找到了0、1、2、3这几个点所在的像素,而0、1、2、3分别是这四个纹素的中心,所以说四舍五入找“原点”只是为了方便找应该用于近似的四个纹素而已。
至于插值计算中,仍然是用原来的坐标值去减去找到的那个纹素的中心点的坐标从而求得应该混合的比例,从而进行混合
而为什么是取中心点的话那是因为老师的课里讲双线性插值那里是这样提到的(见附件),所以我按自己的理解照做了。。- This reply was modified 4 years, 8 months ago by 戴皓天.
Attachments:
You must be logged in to view attached files.-
这里有个地方口胡了,把纹素说成像素了,懂意思就好😂
-
-
-
-
取整后的点不应该是图中的0点而非中心点吗?
占比是怎么计算的呢?
可以试试a*c+b*(1-c)改成a*(1-c)+b*c-
四舍五入的话应该是最中间那个点把,离哪个点近他肯定会四舍五入到最近那个点,如果点离图里的左下角近,那他肯定是近似到左下角去了,然后以那里为原点找周围的四个点做平均
-
-
-
别看交点呀老哥,看每个像素没画出来的中心点。不然图里面的你说的(1,1)是啥颜色。
-
我说的(1,1)就是你图里的纹素2,因为每个纹素的坐标不是它的中心,是它的左下角,所以我才会取到你说的交点,如果要问为什么这样想的话,因为像素就是这样的,老师讲像素的时候就说默认是拿每个像素左下角那个点当作这个像素的坐标。因为不论是像素还是纹素,它本质都是一个正方形,所以需要有一个坐标来当作整个正方形的坐标,你的意思应该是拿每个正方形中心点的坐标来代表整个正方形的坐标了吧,但是我的想法是拿左下角代表,所以我会四舍五入到“交点”,而这个“交点”虽然看起来是这个几个纹素的交点,但实际上也是纹素2的坐标位置(因为每个纹素是拿左下角的点的坐标代表整个纹素的坐标的,所以纹素2的坐标就是(1,1),也就是“交点”)
-
我懂你的意思了,谢谢。应该是我们所选取的坐标系标准不同导致我们会有歧义,可能我的问题就是出在这里,我再找点资料自己再试一试吧
-
你把原点位置 想在在交点,round 完的结果在像素中心理解看看
(实际上这个位置定义每个软件啥的都不一样,我咋记得老师说过按像素中心是坐标点算)然后插值计算的时候记得是离得远,占据比重小,别算反了
This post has received 1 vote up.-
谢谢,我自己刚才再看一遍也发现了,确实是比重算错了,所以才会毛毛糙糙的😂
-
跟楼主出来的效果一样,看了你的离得远,占据比重小一下就明白我错哪了
-
-
-
-
-
-
-
谢了老哥,谢谢提醒,已经好了,坐标只是标准引起的歧义,主要是你一开始说的比重的问题,我算反了,反过来就好了😂
-
-
已经完成了,使用的是612×612的小贴图,效果见附件
头疼了一天,居然出在一个我自己觉得肯定不会出问题的地方😂
总结一下吧,也算替给同学踩个坑:
主要问题出在我的lerp实现上,设需要用于双线性插值的四个纹素为A、B、C、D,分别相对位于目标位置(就是需要求颜色的那个位置)的左下角,右下角,左上角,右上角,可以简单看作它们的坐标分别为(0,0) , (1,0) , (1,0) , (1,1)
那么在双线性插值时,首先先对u方向插值,那么u方向需要求两次插值,也就是对于(0,0) , (1,0)和目标坐标(u,v)做一次插值,另外要对(1,0) , (1,1)和(u,v)做一次插值。
假设先算第一个,那么需要求出u-0(只是这里恰好时0,正常情况下减去四个点里最小的u值即可)
那么此时求出的插值颜色应该是(1-(u-0))*getColor(0,0)+(u-0)*getColor(1,0)
因为离(0,0)越近,u-0越小,但实际上它的颜色对于目标点(u,v)的影响越大,所以要反过来,前面的getColor(0,0)项前面要用1-至于坐标标准的理解我自认为应没问题,需要的可以看我上面的回帖
This post has received 1 vote up and 1 vote down.Attachments:
You must be logged in to view attached files.-
p0e0o0p0l0e0Participant
感谢楼主,因为比重和距离成反比的问题困扰了好久。
-
-
你蹄子那儿好使吗
-
MegaDNAParticipant
过了这么久了不好意思打扰一下,我的实现方法跟楼主的几乎一样,但后来又发现通过这种方法在纹理图边缘的点怎么插值,边缘的点通过四舍五入的话岂不是只能找到一个或者两个相邻的点吗?
-
-
AuthorPosts
- You must be logged in to reply to this topic.