baidu_27304211 2023-08-23 11:29 采纳率: 26.7%
浏览 27
已结题

obj索引分块的jpg图片时有边界条纹

生产三维模型,输入为DSM和DOM,首先生成.obj文件,然后转为OSGB文件。如果模型过大,则首先会将模型进行分块,生成多块.obj文件再进行后续处理。
生产.obj文件时,可以通过vt的数值来索引纹理图片(例如JPG图片)的像素值,但如果纹理图片过大,obj转为osgb格式后数据量会较大,因此需要对JPG图片也按照同样比例大小进行分块。
但分块后发现,用之前的vt(即UV坐标)计算方法,各模型块之间有明显的分界条纹!!,如下图所示:

img

原vt计算方法为:(注:原始数据是按原始影像行列号,从左上到右下,先行后列,规则排列的,共有lPixelCount各元素,每行wsPart个,每列hsPart个,lPixelCount = wsPart * hsPart,该算法其实就是计算第n个点所在行和列,与该行、列总元素数做比,Y向要作差)

            for (long n = 0; n < lPixelCount; n++)
            {
                long lVert1Ind = n;
                long lVert1Ind_x = 0;
                long lVert1Ind_y = 0;

                //
                pdVtCloudX[n] = (double)(lVert1Ind % wsPart) / (double)(wsPart - 1);
                lVert1Ind_y = lVert1Ind / wsPart + 1;
                pdVtCloudY[n] = (double)(hsPart - lVert1Ind_y) / (double)(hsPart);

            }

后来对vt的计算方式做了修改,代码如下:

            for (long n = 0; n < lPixelCount; n++)
            {
                long lVert1Ind = n;
                long lVert1Ind_x = 0;
                long lVert1Ind_y = 0;

                ////UV不为1
                pdVtCloudX[n] = (double)(lVert1Ind % wsPart + 1) / (double)(wsPart + 1);
                lVert1Ind_y = lVert1Ind / wsPart + 1;
                pdVtCloudY[n] = (double)(hsPart - lVert1Ind_y + 1) / (double)(hsPart + 1);

            }

上述代码保证了vt坐标不会为0和1,模型拼接后不再有边界条纹,但是出现了像素拼接不上的情况,如下图:

img

做了很多测试,比如对JPG分块分别是用CV库,或者直接将DOM在代码中截取然后转成JPG图片,或者使用其他格式图片(例如BMP、png等),这些方法仍然会有上述现象,初步猜想可能是JPG图片边缘有一圈边框条纹,请教如何解决上述问题?

  • 写回答

6条回答 默认 最新

  • Leodong. 2023-08-23 11:41
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    您遇到的边界条纹问题可能是由于纹理映射(texture mapping)时的插值问题导致的。当将纹理图片分块后,每个模型块的纹理坐标在边界处不连续,导致纹理插值出现问题,进而产生了可见的分界条纹。

    有几种方法可以尝试解决这个问题:
    1、 纹理边界处理:在生成分块的纹理图片时,可以在每个块的边界处添加一圈无纹理的边缘像素。这样可以确保纹理坐标在边界处的插值不会受到相邻块的影响,减少分界条纹的出现。

    2、 纹理坐标偏移:在计算纹理坐标时,对于每个模型块的纹理坐标进行微小的偏移,使得相邻块的纹理坐标在边界处略微重叠。这样可以减少插值时的不连续性,减少分界条纹的出现。

    3、 纹理过滤设置:在加载纹理时,可以尝试设置纹理过滤选项,如使用双线性插值(bilinear interpolation)或三线性插值(trilinear interpolation)。这些过滤选项可以平滑纹理的插值过程,减少分界条纹的可见性。

    4、 使用无损格式:考虑使用无损的纹理格式,如PNG,而不是有损的JPEG。JPEG图像通常会在边缘处产生一些压缩伪影,这可能导致分界条纹的出现。使用无损格式可以避免这个问题。

    请注意,以上方法可能需要根据您的具体情况进行适当的调整和实验。您可以尝试组合使用这些方法,以找到适合您场景的最佳解决方案。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月28日
  • 修改了问题 8月23日
  • 创建了问题 8月23日

悬赏问题

  • ¥15 r语言xlsx包下载后使用时出现了下列问题该如何解决
  • ¥15 Arcgis河网分级报错
  • ¥200 java+appium2.1+idea
  • ¥20 请帮我做一个EXE的去重TXT文本
  • ¥15 工价表引用工艺路线,应如何制作py和xml文件
  • ¥15 根据历史数据,推荐问题类型
  • ¥15 需要仿真图,简单的二阶系统实例
  • ¥15 stm32光控照明仿真
  • ¥15 使用人工智能的方法生成满足一定统计参数要求的随机数序列
  • ¥15 SENT协议中相关问题咨询