生产三维模型,输入为DSM和DOM,首先生成.obj文件,然后转为OSGB文件。如果模型过大,则首先会将模型进行分块,生成多块.obj文件再进行后续处理。
生产.obj文件时,可以通过vt的数值来索引纹理图片(例如JPG图片)的像素值,但如果纹理图片过大,obj转为osgb格式后数据量会较大,因此需要对JPG图片也按照同样比例大小进行分块。
但分块后发现,用之前的vt(即UV坐标)计算方法,各模型块之间有明显的分界条纹!!,如下图所示:
原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,模型拼接后不再有边界条纹,但是出现了像素拼接不上的情况,如下图:
做了很多测试,比如对JPG分块分别是用CV库,或者直接将DOM在代码中截取然后转成JPG图片,或者使用其他格式图片(例如BMP、png等),这些方法仍然会有上述现象,初步猜想可能是JPG图片边缘有一圈边框条纹,请教如何解决上述问题?
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
您遇到的边界条纹问题可能是由于纹理映射(texture mapping)时的插值问题导致的。当将纹理图片分块后,每个模型块的纹理坐标在边界处不连续,导致纹理插值出现问题,进而产生了可见的分界条纹。
有几种方法可以尝试解决这个问题:
1、 纹理边界处理:在生成分块的纹理图片时,可以在每个块的边界处添加一圈无纹理的边缘像素。这样可以确保纹理坐标在边界处的插值不会受到相邻块的影响,减少分界条纹的出现。
2、 纹理坐标偏移:在计算纹理坐标时,对于每个模型块的纹理坐标进行微小的偏移,使得相邻块的纹理坐标在边界处略微重叠。这样可以减少插值时的不连续性,减少分界条纹的出现。
3、 纹理过滤设置:在加载纹理时,可以尝试设置纹理过滤选项,如使用双线性插值(bilinear interpolation)或三线性插值(trilinear interpolation)。这些过滤选项可以平滑纹理的插值过程,减少分界条纹的可见性。
4、 使用无损格式:考虑使用无损的纹理格式,如PNG,而不是有损的JPEG。JPEG图像通常会在边缘处产生一些压缩伪影,这可能导致分界条纹的出现。使用无损格式可以避免这个问题。
请注意,以上方法可能需要根据您的具体情况进行适当的调整和实验。您可以尝试组合使用这些方法,以找到适合您场景的最佳解决方案。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
在解码图像块后,对相邻的图像块进行平滑处理,将边界的颜色或亮度进行平均化,以减少条纹的出现。
【以下回答由 GPT 生成】
我能理解你遇到的问题。根据你的描述,这个问题的主要原因可能是纹理图片边缘存在一圈边框条纹导致的。为了解决这个问题,你可以尝试以下方法:
下面是使用OpenCV对纹理图片进行高斯模糊处理的示例代码:
```python import cv2
# 读取纹理图片 img = cv2.imread('texture.jpg')
# 高斯模糊处理 blurred_img = cv2.GaussianBlur(img, (5, 5), 0)
# 保存处理后的图片 cv2.imwrite('preprocessed_texture.jpg', blurred_img) ```
修改vt计算方法:如果预处理纹理图片无法完全解决问题,你可以尝试修改vt的计算方法。在你的代码中,你已经对计算方法进行了修改,以确保vt坐标不为0和1。但是你可能需要进一步调整参数,试验不同的公式,或者根据实际情况灵活调整计算方法。
使用更高质量的纹理图片:尝试使用更高质量的纹理图片,例如PNG文件格式,以减少条纹出现的可能性。PNG格式支持无损压缩,可以提供更好的图像质量。
如果尝试了以上方法仍然没有解决问题,可能需要进一步调查原因,例如检查纹理图像坐标的转换过程,或者尝试使用其他工具或库进行转换。
希望以上方法对你有所帮助!如果还有其他问题,请随时提问。
opencv4.5.1 C++ 指针遍历操作像素图像出现周期性条纹的问题解决
可以参考下
引用gpt作答:
您遇到的问题可能是由于图像分块导致的边界条纹问题。这种情况在分块处理时经常出现,由于纹理坐标计算的精度限制以及图像分块的边界,可能会产生明显的分界条纹。
一种常见的解决方法是在图像分块的边界处进行纹理坐标的平滑过渡。可以使用纹理坐标差值或者修正来减少边界条纹的出现。以下是一些可能的解决方案:
纹理坐标差值:在相邻分块的边界处,可以通过计算两个分块的纹理坐标之间的差值,然后在边界处进行差值。这样可以使相邻分块的纹理坐标在边界处平滑过渡,减少可见的分界条纹。
纹理坐标修正:在计算纹理坐标时,针对分块边界的点进行修正。可以根据实际情况尝试不同的修正方法,例如在边界处略微调整纹理坐标的值,使得相邻分块的纹理在边界处更好地对应起来。
使用无损格式图片:尝试使用无损格式的图片,如PNG,而不是有损压缩的图片格式如JPEG。无损格式可以减少图像压缩产生的边界条纹。
请注意,解决此问题可能需要根据您的具体场景进行试验和调整。同时,也考虑到您使用的是C++语言开发,您可能需要在图像处理库(如OpenCV)中进行相应的代码修改和处理,以实现纹理坐标的平滑过渡和修正。