图像质量评估(10) -- 纹理丢失(Texture Loss)

     在数字图像领域,纹理(texture)通常是指低对比度的细节。举例来说,一片草原上的单个草叶,树上的叶片等都是细节或叫做纹理。相机原则上要能够重现这些细节。对于相机来说,要在低光照使用更高ISO灵敏度设置的场景中从不想要的噪声中区分出纹理是极具挑战的事情。因此,对图像进行降噪处理时通常会导致纹理丢失。

        简单来说,纹理丢失可以认为是图像由于降噪原因丢失了细节。如今的高级图像处理技术让减少不想要的噪声和其他瑕疵变得更加容易。但这个过程也会减少纹理,导致较差的图像质量。

        对于这个问题,推荐的方法是找到一个平衡点,让降噪处理和纹理丢失之间能够兼顾。为了实现这个目的,噪声以及纹理丢失需要被量化分析。

降噪处理造成的纹理丢失对比图(上图为原图,下图为进行降噪处理后的图)    

 如何测量纹理丢失

        纹理丢失的测量方法从技术角度看就是对分辨率的测量,但和ISO 12233(分辨率标准)里所描述的测试对象不同,它使用了一个不同的测试对象。在测试过程中,被测设备会重现测试对象,分析软件(如iQ-Analyzer-X)会提供一个SFR(空间频率响应,Spatial Frequency Response)值。这个SFR描述了系统在图像中重现纹理的能力如何。

        前面提到了纹理被定义为低对比度的细节。因此测试对象也需要有低对比度细节。对于纹理丢失的测试,有两种不同的可用的测试对象。

低对比度西门子星图(Low contrast Siemens star)

        ISO 12233标准中所说的s-SFR方法是基于高对比度的西门子星图,如下图:

         这种方法对于锐化(sharpening)处理有较好的鲁棒性,并且对于极限分辨率的测量来说是一个很好的工具。

        同时ISO 19567主要关注于纹理丢失的测量。这个标准基于s-SFR方法,但使用了一个低对比度版本的西门子星图,如下:

         简而言之,分析软件会检测西门子星图的中心,然后沿着图像的径向读出数值。使用这些值来计算调制,在所有半径和角度上都完成后产生一个SFR值。如果我们的处理停留在这个空域里,这个SFR的计算就完全基于所采集的数值的分析。

枯叶对象(dead leaves target)是什么

        和西门子星图不同,枯叶图为纹理丢失测试所创建的场景更加贴近自然场景。

        图卡本身是作为自然图像的模型而被引入的。本质上,图卡是一副大量堆叠起来的圆形组成的,圆形的大小和颜色按照一个已知的概率分布。枯叶对象初版仍然是灰色的,但最新的研究使用了带颜色的版本,因为这样能更好地反映出自然的场景,并且最终让测量过程和用户体验之间有了更好的相关性。

 灰色的枯叶图

 彩色枯叶图

如何使用枯叶对象分析纹理丢失

        多年来,发展出了多种不同的基于枯叶图模式的方法用于分析图像。早期的方法容易被图像噪声所影响,这些方法看起来更像是“概念验证”而不是可靠的测量。枯叶图对象相比于其它的测试样例来说看起来更加的自然,并且它的功率谱也是一个有改进的地方。如果我们知道了目标的功率谱,并且我们能测量出图像中的功率谱,我们就能简单地计算出传递函数的绝对值。        

计算传输函数的绝对值

(absolute of tranfer function,此处理解不深,请大神指正)

枯叶图直接测量法(Dead leaves direct method)

        John McElvain等人提出了一个更具鲁棒性、可靠的分析方法。早期的方法只计算了对象的功率谱,并测量了图像的功率谱。

早期方法

        早期方法遗漏点:相机不仅在空间频率传递中去除了(高)空间频率,而且还给图像增加了噪点。 因此,这种噪声还将增加高空间频率,这会干扰测量。

        John等人提出的枯叶图直接测量法增加了噪声功率谱的测量并将其加入到计算中用来校准。噪声的测量需要额外的灰色区域。

        

         

         虽然枯叶图直接测量法考虑到了相机的噪声会影响到功率谱的测量,相比于早期的方法有了较大改进,但它仍然有一些问题。

        当测量纹理丢失的时候,我们假定相机多少会做一些降噪处理。现代化的降噪算法会根据图像内容在功能上做不同的调整。但这个方法假设从灰块测出的噪声和相机引入到枯叶图结构的噪声是相同的,这个假设实际上在许多场景中并不正确,在灰块上测出的噪声要比在枯叶图结构中所找到的噪声要少。

枯叶图交叉测量法(Dead leaves cross method)

        2014年被引入的一种全新的方法,使用此方法能够计算出完整的传递函数,包括相位信息,最终能够不受图像噪声或其他瑕疵影响计算出SFR。

 总结

        当我们做完分析计算后,会得到一个SFR。这个SFR描述了被测设备对对象的重现程度。换句话将就是,SFR越低,纹理丢失的情况就越严重。由于镜头和传感器对SFR的值都有共享,建议对比一下从枯叶图获取的SFR和另一种健壮的测量方法所得的SFR,比如s-SFR。

GL_TEXTURE_EXTERNAL_OES是OpenGL ES中用于外部纹理的一种纹理类型。它通常用于显示来自外部硬件设备(如相机)的视频流或其他外部数据源的图像。因为它是外部纹理,所以不能直接使用glTexImage2D等函数加载纹理图像,需要通过其他方式获取它的图像数据。 一种常见的方式是使用Android中的SurfaceTexture类,它可以将外部纹理映射到纹理对象上,并提供对纹理对象的访问。在OpenGL ES中,可以通过glGenTextures生成纹理对象,然后将SurfaceTexture的纹理ID绑定到该对象上,即可获取外部纹理图像。 以下是一些示例代码,展示如何使用SurfaceTexture和纹理对象抓取外部纹理图像: ```java // 创建一个SurfaceTexture对象,指定外部纹理ID SurfaceTexture surfaceTexture = new SurfaceTexture(externalTextureId); // 获取SurfaceTexture所对应的Surface对象 Surface surface = new Surface(surfaceTexture); // 创建一个EGLDisplay、EGLSurface和EGLContext // 然后将EGLSurface绑定到Surface上 // 获取外部纹理图像的宽度和高度 int width = 0, height = 0; GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, externalTextureId); GLES20.glGetTexLevelParameteriv(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES20.GL_TEXTURE_WIDTH, mTexWidth, 0); GLES20.glGetTexLevelParameteriv(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES20.GL_TEXTURE_HEIGHT, mTexHeight, 0); // 创建一个2D纹理对象 int[] textures = new int[1]; GLES20.glGenTextures(1, textures, 0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); // 将SurfaceTexture的纹理ID绑定到纹理对象上 GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); surfaceTexture.updateTexImage(); // 解绑纹理对象和EGLSurface、EGLContext等 ``` 这里的externalTextureId是外部纹理的ID,可以通过其他方式获取。注意,在使用SurfaceTexture时,需要使用正确的纹理类型(GLES11Ext.GL_TEXTURE_EXTERNAL_OES),并且需要在更新纹理图像之前调用surfaceTexture.updateTexImage()函数来更新纹理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦枫Leonlew

希望这篇文章能帮到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值