图像处理器 流程

2016-07-19 21:29:54 LG1259156776 阅读数 4150
1        前言
做为拍照手机的核心模块之一,camera sensor效果的调整,涉及到众多的参数,如果对基本的光学原理及sensor软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果。否则,缺乏了理论的指导,只能是凭感觉和经验去碰,往往无法准确的把握问题的关键,不能掌握sensor调试的核心技术,无法根本的解决问题。
所以,这里笔者结合自己出于对摄影的爱好所学习的一些图像处理相关的原理,试图通过分析一些与Sensor图像处理相关的因素,和大家分享一下自己的一些理解,共同探讨,共同学习进步。
2        色彩感应及校正
2.1       原理
人眼对色彩的识别,是基于人眼对光线存在三种不同的感应单元,不同的感应单元对不同波段的光有不同的响应曲线的原理,通过大脑的合成得到色彩的感知。 一般来说,我们可以通俗的用RGB三基色的概念来理解颜色的分解和合成。
 
理论上,如果人眼和sensor对光谱的色光的响应,在光谱上的体现如下的话,基本上对三色光的响应,相互之间不会发生影响,没有所谓的交叉效应。
 
但是,实际情况并没有如此理想,下图表示了人眼的三色感应系统对光谱的响应情况。可见RGB的响应并不是完全独立的。
下图则表示了某Kodak相机光谱的响应。可见其与人眼的响应曲线有较大的区别。
2.2       对sensor的色彩感应的校正
既然我们已经看到sensor对光谱的响应,在RGB各分量上与人眼对光谱的响应通常是有偏差的,当然就需要对其进行校正。不光是在交叉效应上,同样对色彩各分量的响应强度也需要校正。通常的做法是通过一个色彩校正矩阵对颜色进行一次校正。

1

该色彩校正的运算通常是由sensor模块集成或后端的ISP完成,软件通过修改相关寄存器得到正确的校正结果。值得注意的一点是,由于RGB -> YUV的转换也是通过一个3*3的变换矩阵来实现的,所以有时候这两个矩阵在ISP处理的过程中会合并在一起,通过一次矩阵运算操作完成色彩的校正和颜色空间的转换。
3        颜色空间
3.1       分类
实际上颜色的描述是非常复杂的,比如RGB三基色加光系统就不能涵盖所有可能的颜色,出于各种色彩表达,以及色彩变换和软硬件应用的需求,存在各种各样的颜色模型及色彩空间的表达方式。这些颜色模型,根据不同的划分标准,可以按不同的原则划分为不同的类别。
匹配任意可见光所需的三原色光比例曲线
 
对于sensor来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV这两种(实际上,这两种体系包含了许多种不同的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …), RGB如前所述就是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。
3.1.1               RGB <-> YUV的转换
不比其它颜色空间的转换有一个标准的转换公式,因为YUV在很大程度上是与硬件相关的,所以RGB与YUV的转换公式通常会多个版本,略有不同。
 
常见的公式如下:
Y=0.30R+0.59G+0.11B
U=0.493(B
Y) =0.15R0.29G+0.44B
V=0.877(R
Y) = 0.62R0.52G0.10B
 
但是这样获得的YUV值存在着负值以及取值范围上下限之差不为255等等问题,不利于计算机处理,所以根据不同的理解和需求,通常在软件处理中会用到各种不同的变形的公式,这里就不列举了。
体现在Sensor上,我们也会发现有些Sensor可以设置YUV的输出取值范围。原因就在于此。
从公式中,我们关键要理解的一点是,UV 信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助。


1.1       白平衡
1.1.1         色温
色温的定义:将黑体从绝对零度开始加温,温度每升高一度称为1开氏度(用字母K来表示),当温度升高到一定程度时候,黑体便辐射出可见光,其光谱成份以及给人的感觉也会着温度的不断升高发生相应的变化。于是,就把黑体辐射一定色光的温度定为发射相同色光光源的色温。
常见光源色温:
光源                        色温(K)
    钨丝灯(白炽灯)            2500-3200k
    碳棒灯                      4000-5500k
    荧光灯(日光灯,节能灯)   4500-6500k
氙灯                        5600 k
炭精灯                      5500~6500k
    日光平均                    5400k
    有云天气下的日光            6500-7000k
    阴天日光                    12000-18000k
 
随着色温的升高,光源的颜色由暖色向冷色过渡,光源中的能量分布也由红光端向蓝光端偏移。
值得注意的是,实际光源的光谱分布各不相同,而色温只是代表了能量的偏重程度,并不反映具体的光谱分布,所以即使相同色温的光源,也可能引起不同的色彩反应。
人眼及大脑对色温有一定的生理和心理的自适应性,所以看到的颜色受色温偏移的影响较小,而camera的sersor没有这种能力,所以拍出来的照片不经过白平衡处理的话,和人眼看到的颜色会有较大的偏差(虽然人眼看到的和白光下真实的色彩也有偏差)。
太阳光色温随天气和时间变化的原因,与不同频率光的折射率有关:
波长长的光线,折射率小,透射能力强,波长短的光线,折射率大,容易被散射,折射率低,这也就是为什么交通灯用红色,防雾灯通常是黄色,天空为什么是蓝色的等等现象的原因。
知道了这一点,太阳光色温变化的规律和原因也就可以理解和分析了,留给大家自己思考。
 
 
1.1.1         色温变化时的色彩校正
所以从理论上可以看出,随着色温的升高,要对色温进行较正,否则,物体在这样的光线条件下所表现出来的颜色就会偏离其正常的颜色,因此需要降低 sensor对红色的增益,增加sersor对蓝光的增益。同时在调整参数时一定程度上要考虑到整体亮度的要保持大致的不变,即以YUV来衡量时,Y值要基本保持不变,理论上认为可以参考RGB->YUV变换公式中,RGB三分量对Y值的贡献,从而确定RGAIN和BGAIN的变化的比例关系。但实际情况比这还要复杂一些,要考虑到不同sensor对R,B的感光的交叉影响和非线性,所以最佳值可能和理论值会有一些偏差。
1.1.2         自动白平衡原理
1.1.2.1       原理
自动白平衡是基于假设场景的色彩的平均值落在一个特定的范围内,如果测量得到结果偏离该范围,则调整对应参数,校正直到其均值落入指定范围。该处理过程可能基于YUV空间,也可能基于RGB空间来进行。对于Sensor来说,通常的处理方式是通过校正R/B增益,使得UV值落在一个指定的范围内。从而实现自动白平衡。
 
1.1.2.2       特殊情况的处理
在自动白平衡中,容易遇到的问题是,如果拍摄的场景,排除光线色温的影响,其本身颜色就是偏离平均颜色值的,比如大面积的偏向某种颜色的图案如:草地,红旗,蓝天等等,这时候,强制白平衡将其平均颜色调整到灰色附近,图像颜色就会严重失真。
因此,通常的做法是:在处理自动白平衡时,除了做为目标结果的预期颜色范围外,另外再设置一对源图像的颜色范围阙值,如果未经处理的图像其颜色均值超出了该阙值的话,根本就不对其做自动白平衡处理。由此保证了上述特殊情况的正确处理。
可见,这两对阙值的确定对于自动白平衡的效果起着关键性的作用。
1.1.3         某平台的例子
英文代码              中文界面       色温       色温       RGAIN, GGAIN,   BGAIN
cloud           阴天        7500k   0x1D4C, 0x00CD, 0x0085, 0x0080
daylight        日光        6500k   0x1964, 0x00A3, 0x0080, 0x0088
INCANDESCENCE   白热光    5000k   0x1388, 0x00A5, 0x0080, 0x0088
FLUORESCENT     日光灯      4400k   0x1130, 0x0098, 0x0080, 0x00A8
TUNGSTEN        钨丝灯      2800k   0x0AF0, 0x0080, 0x0081, 0x00A4
 
可以看到随着色温的升高,其变化规律基本符合上节中的理论分析。不过这里多数参数与理论值都有一些偏差,其中日光灯的色温参数设置与理论值有较大的偏差,实际效果也证明该日光灯的参数设置使得在家用日光灯环境下拍摄得到的照片颜色偏蓝。修改其参数后实拍效果明显改善。(再查一些资料可以看到通常会有两种荧光灯色温 4000 和 5000K,目前我所接触到的应该是5000K居多)
1.1.4         调试和验证
具体参数的调整,应该在灯箱环境下,使用各种已知色温的标准光源对标准色卡拍摄,在Pc机上由取色工具测量得到其与标准色板的RGB分量上的色彩偏差,相应的调整各分量增益的比例关系。为了更精确的得到结果,曝光量增益的设置在此之前应该相对准确的校正过

颜色相关特效处理
1.1       grayscale (灰阶)
灰阶图的效果就是将彩色图片转换为黑白图片。
1.2       理论
理论上,在YUV空间,将UV分量丢弃,只保留Y分量,这样就可以得到黑白图像,这也是彩色电式机信号能兼容黑白电视机的原理。如下图理论上Y值一样的颜色(右边是用acdsee转成灰度图的效果),在grayscale模式下看应该是一样的颜色。
    
算法上的操作,理论上应该把UV值改成灰色对应数值就可以了。不过根据软件算法和硬件结构的不同,具体代码也会有不同。
1.3       以某平台为例
核心的两行代码如下:
       SET_HUE_U_GAIN(0);
       SET_HUE_V_GAIN(0);
这里设置UV GAIN为0,如果UV offset设置为128的话,最终得到的UV就是128,这就和理论是相符合的。
1.4       sepia / sepiagreen / sepiablue
所谓的复古(绿,蓝)就是在灰阶的基础上,对UV值额外再做了一个offset,将灰度图转换成某种颜色的梯度图。理论上为了获得蓝色效果,应该增加蓝色差信号,减小红色差信号。即增大U,减小V。
以sepiablue效果为例,这里的字节的MSB表示符号位:所以88为88,158为-30。
    SET_HUE_U_GAIN(0); 
    SET_HUE_V_GAIN(0); 
    SET_HUE_U_OFFSET(88);
    SET_HUE_V_OFFSET(158);
 
 
1.5       negative
所谓负片效果,就是将图像的颜色反转,看起来就像是在看胶片底片时的效果。这从理论上也很容易理解和处理,就是在RGB空间,取其补色,具体的操作就是用255分别减去RGB得到新的RGB值。通常会在ISP中实现该功能。
 
2        小结
理解了原理,要做出其它颜色变换方面的效果就很容易了。
基本上,在颜色校正和处理方面,需要考虑的相关参数大致包括:
自动WB上下限,自动白平衡时的目标范围,RGB gain, UV gain, UV offset, color correction.有些还会有saturation 和 hue相关的设置。
从sensor或ISP硬件处理的流程上说,通常方向是先做RGB gain,再做color correction,最后做YUV空间的处理。所以调整效果的时候,为了减少参数之间的相互影响,基本上也可以按这个顺序来调整参数。


1.1       亮度感应及曝光
1.1.1         感光宽容度
从最明亮到最黑暗,假设人眼能够看到一定的范围,那么胶片(或CCD等电子感光器件)所能表现的远比人眼看到的范围小的多,而这个有限的范围就是感光宽容度。
人眼的感光宽容度比胶片要高很多,而胶片的感光宽容度要比数码相机的ccd高出很多!了解这个概念之后,我们就不难了解,为什么在逆光的条件下,人眼能看清背光的建筑物以及耀眼的天空云彩。而一旦拍摄出来,要么就是云彩颜色绚烂而建筑物变成了黑糊糊的剪影,要么就是建筑物色彩细节清楚而原本美丽的云彩却成了白色的一片
再看人眼的结构,有瞳孔可以控制通光量,有杆状感光细胞和椎状感光细胞以适应不同的光强,可见即使人眼有着很高的感光宽容度,依然有亮度调节系统,以适应光强变化。
那么对于camera sensor来说,正确的曝光就更为重要了!
1.1.2         自动曝光和18%灰
对于sensor来说,又是如何来判断曝光是否正确呢?很标准的做法就是在YUV空间计算当前图像的Y值的均值。调节各种曝光参数设定(自动或手动),使得该均值落在一个目标值附近的时候,就认为得到了正确的曝光。
那么如何确定这个Y的均值,以及如何调整参数使得sensor能够将当前图像的亮度调整到这个范围呢?
这就涉及到一个概念 18%灰,一般认为室内室外的景物,在通常的情况下,其平均的反光系数大约为18%,而色彩均值,如前所述,可以认为是一种中灰的色调。这样,可以通过对反光率为18%的灰板拍摄,调整曝光参数,使其颜色接近为中等亮度的灰色(Y值为128)。然后,对于通常的景物,就能自动的得到正确的曝光了。
 
当然这种自动判断曝光参数的AE功能不是万能的,对于反光率偏离通常均值的场景,比如雪景,夜景等,用这种方法就无法得到正确的曝光量了。所以在sensor的软件处理模块中,通常还会提供曝光级别的设定功能,强制改变自动曝光的判断标准。比如改变预期的亮度均值等。
1.1.3         曝光级别设定
在多数数码相机和拍照手机上都可以看到曝光级别设定的功能,如前所述,这种设定实际上是在自动曝光的基础上给用户提供一定的曝光控制能力,强制改变camera sensor的曝光判断标准,获得用户想要的效果。
通常的做法就是改变Y值均值的预期值,使得sensor在自动曝光时以新的Y预期值为目标,自动调整Exptime 和 AG。
1.1.4         gamma校正
曝光的均值正确了,不代表整体图像的亮度分布就和人眼所看到的保持一致了。
事实上,人眼对亮度的响应并不是一个线性的比例关系,而各种涉及到光电转换的设备的输入输出特性曲线一般也是非线性的,且表现为幂函数的形式:y=xn ,所以整个图像系统的传递函数是一个幂函数。g= g1×g2×…×gn
对于sensor来说,其响应倒是接近为线性关系,所以为了在各种设备上正确输出符合人眼对亮度的响应的图像,就需要进行校正。
幂函数的指数的倒数就是通常所说的gamma值。
归一化的gamma曲线

校正的函数可以表示为 '>1,通常对于Window的输出显示系统,gamma值为2.2,而对于苹果的输出显示系统和打印系统来说,gamma值为1.8。

实际上,sensor在做gamma校正的时候,通常也一并作了从raw格式的10bit的数据到8bit数据的转换,所以这时候的公式可以表示为         对比度

对比度的调整在一定程度上说,其实也就是对gamma曲线的调整,增大对比度就是提高Gamma值。对于图像处理来说,也有在硬件gamma校正后,单独由软件再进行一次类似的幂函数变换来调整对比度。
1.1.6         曝光参数的调整
曝光强度的调整,可以通过改变曝光时间,也可以通过改变亮度增益AG来实现。
曝光时间受到桢频的限制,比如摄像时要求15帧每秒的话,这时候曝光时间最长就不能超过1/15s,可能还有别的条件限制,实际的曝光时间还要短,在光线弱的情况下,单独调整曝光时间就无法满足帧频的需要了。
这时候还可以调整增益AG,来控制曝光的增益,降低曝光时间。但是,这样做的缺点是以牺牲图像质量为代价的,AG的增强,伴随的必然是信噪比的降低,图像噪声的增强。
所以,以图像质量为优先考虑的时候,曝光参数的调节通常是优先考虑调节曝光时间,其次在考虑曝光增益。当然曝光时间也不能过长以免由于抖动造成图像的模糊,而在拍摄运动场景时,对曝光时间的要求就更高了



1.1       抗噪处理

AG 的增大,不可避免的带来噪点的增多,此外,如果光线较暗,曝光时间过长,也会增加噪点的数目(从数码相机上看,主要是因为长时间曝光,感光元件温度升高,电流噪声造成感光元件噪点的增多),而感光元件本身的缺陷也是噪点甚至坏点的来源之一。因此,通常sensor集成或后端的ISP都带有降噪功能的相关设置。
1.1.1         启动时机
根据噪点形成的原因,主要是AG或Exptime超过一定值后需要启动降噪功能,因此通常需要确定这两个参数的阙值,过小和过大都不好。
从下面的降噪处理的办法将会看到,降噪势附带的带来图像质量的下降,所以过早启动降噪功能,在不必要的情况下做降噪处理不但增加处理器或ISP的负担,还有可能适得其反。而过迟启动降噪功能,则在原本需要它的时候,起不到相应的作用。
1.1.2         判定原则和处理方式
那么如何判定一个点是否是噪点呢?我们从人是如何识别噪点的开始讨论,对于人眼来说,判定一个点是噪点,无外乎就是这一点的亮度或颜色与边上大部分的点差异过大。从噪点产生的机制来说,颜色的异常应该是总是伴随着亮度的异常,而且对亮度异常的处理工作量比颜色异常要小,所以通常sensor ISP的判定原则是一个点的亮度与周围点的亮度的差值大于一个阙值的时候,就认为该点是一个噪点。
处理的方式,通常是对周围的点取均值来替代原先的值,这种做法并不增加信息量,类似于一个模糊算法。
对于高端的数码相机,拥有较强的图像处理芯片,在判定和处理方面是否有更复杂的算法,估计也是有可能的。比如亮度和颜色综合作为标准来判定噪点,采用运算量更大的插值算法做补偿,对于sensor固有的坏点,噪点,采用屏蔽的方式抛弃其数据(Nikon就是这么做的,其它厂商应该也如此)等等。
1.1.3         效果
对于手机sensor来说,这种降噪处理的作用有多大,笔者个人认为应该很有限,毕竟相对数码相机,手机sensor的镜头太小,通光量小,所以其基准AG势必就比相机的增益要大(比如相当于普通家用数码相机ISO800的水平),这样才能获得同样的亮度,所以电流噪声带来的影响也就要大得多。这样一来,即使最佳情况,噪点也会很多,数据本身的波动就很大,这也就造成我们在手机照片上势必会看到的密密麻麻的花点,如果全部做平均,降低了噪点的同时,图像也会变得模糊,所以手机噪点的判断阙值会设得比较高,以免涉及面过大,模糊了整体图像。这样一来一是数据本身就差,二是降噪的标准也降低了,造成总体效果不佳。
1.2       数码变焦
数码变焦可以有两种形式:
其一,是通过插值算法,对图像进行插值运算,将图像的尺寸扩大到所需的规格,这种算法就其效果而言,并不理想,尤其是当使用在手机上的时候,手机上的摄像头本身得到的数据就有较大的噪声,再插值的话,得到的图像几乎没法使用。实际上,即使是数码相机的数码变焦功能也没有太大的实用价值。如果插值算法没有硬件支持,则需要在应用层实现。我司某平台的数码变焦用的就是该种办法。
 
其二,其实是一种伪数码变焦的形式,当摄像头不处在最大分辨率格式的情况下,比如130万像素的sensor使用640*480的规格拍照时,仍旧设置sersor工作在1280*960的分辨率下,而后通过采集中央部分的图像来获取640*480的照片,使得在手机上看来所拍物体尺寸被放大了一倍。也有很多手机采用的是这种数码变焦方式,这种办法几乎不需要额外的算法支持,对图像质量也没有影响,缺点是只有小尺寸情况下可以采用。此外在DV方式下也可以实现所谓的数码变焦放大拍摄功能。(这应该是一个卖点,对Dv来说,这种数码变焦还是有实际意义的)
要采用这种变焦模式,驱动需要支持windowing功能,获取所需部分的sensor图像数据。
1.3       频闪抑制功能
1.3.1         何谓频闪
日常使用的普通光源如白炽灯、日光灯、石英灯等都是直接用220/50Hz交流电工作,每秒钟内正负半周各变化50次,因而导致灯光在1秒钟内发生100(50×2)次的闪烁,再加上市电电压的不稳定,灯光忽明忽暗,这样就产生了所谓的“频闪”。
下表显示了几种光源的光强波动情况:
因为人眼对光强变化有一定的迟滞和适应性,所以通常看不出光源的亮度变化。但是依然还是会增加眼睛的疲劳程度。所以市场上才会有所谓的无频闪灯销售。
1.3.2         对频闪的抑制
对于camera sensor来说,没有人眼的迟滞和适应过程,所以对光源亮度的变化是比较敏感的。如果不加抑制,在预览和DV模式下,可能会有明显的图像的明亮变化闪烁的现象发生。
如何解决呢?考虑到频闪的周期性,在一个周期内,光源亮度的累积值,应该是大体一致的,所以,如果控制曝光的时间是频闪周期的整倍数,那么每一帧图像的亮度就大体是一致的了,这样就可以有效地抑制频闪对图像亮度的影响。
所以,在自动曝光的模式下,sensor会根据频闪的频率,调整曝光时间为其周期的整倍数。 因为各地的交流电的频率不同,所以有50Hz/60Hz之分。
在具体设置相关Sensor寄存器的时候,要根据电流频率和sensor的时钟频率,分辨率等,计算出频闪周期对应的时钟周期数等。



1        前言
 
自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。我们比较常接触到的就包括 RGB / CMYK / YIQ / YUV / HSI等等。
 
对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV这两种(实际上,这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …), RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。
 
       即使只是RGB YUV这两大类色彩空间,所涉及到的知识也是十分丰富复杂的,在下自知不具备足够的相关专业知识,所以本文主要针对工程领域的应用及算法进行讨论。
 
2        YUV相关色彩空间模型
2.1       YUV 与 YIQ YcrCb
对于YUV模型,实际上很多时候,我们是把它和YIQ / YCrCb模型混为一谈的。
实际上,YUV模型用于PAL制式的电视系统,Y表示亮度,UV并非任何单词的缩写。
YIQ模型与YUV模型类似,用于NTSC制式的电视系统。YIQ颜色空间中的I和Q分量相当于将YUV空间中的UV分量做了一个33度的旋转。
YCbCr颜色空间是由YUV颜色空间派生的一种颜色空间,主要用于数字电视系统中。从RGB到YCbCr的转换中,输入、输出都是8位二进制格式。
三者与RGB的转换方程如下:
RGB -> YUV
实际上也就是:
Y=0.30R+0.59G+0.11B U=0.493(BY) V=0.877(RY)
 
RGB -> YIQ
 
RGB -> YCrCb
从公式中,我们关键要理解的一点是,UV / CbCr信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助。
我们在数字电子多媒体领域所谈到的YUV格式,实际上准确的说,是以YcrCb色彩空间模型为基础的具有多种存储格式的一类颜色模型的家族(包括YUV444 / YUV422 / YUV420 / YUV420P等等)。并不是传统意义上用于PAL制模拟电视的YUV模型。这些YUV模型的区别主要在于UV数据的采样方式和存储方式,这里就不详述。
而在Camera Sensor中,最常用的YUV模型是 YUV422格式,因为它采用4个字节描述两个像素,能和RGB565模型比较好的兼容。有利于Camera Sensor和Camera controller的软硬件接口设计。
 
3        YUV2RGB快速算法分析
这里指的YUV实际是YcrCb了 8 ) YUV2RGB的转换公式本身是很简单的,但是牵涉到浮点运算,所以,如果要实现快速算法,算法结构本身没什么好研究的了,主要是采用整型运算或者查表来加快计算速度。
首先可以推导得到转换公式为:
       R = Y + 1.4075 *(V-128)
       G = Y – 0.3455 *(U –128) – 0.7169 *(V –128)
       B = Y + 1.779 *(U – 128)
3.1       整型算法
要用整型运算代替浮点运算,当然是要用移位的办法了,我们可以很容易得到下列算法:
 
       u = YUVdata[UPOS] - 128;
       v = YUVdata[VPOS] - 128;
     
rdif = v + ((v * 103) >> 8);
       invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
       bdif = u +( (u*198) >> 8);
 
       r = YUVdata[YPOS] + rdif;
       g = YUVdata[YPOS] - invgdif;
       b = YUVdata[YPOS] + bdif;
 
为了防止出现溢出,还需要判错计算的结果是否在0-255范围内,做类似下面的判断。
       if (r>255)
              r=255;
       if (r<0)
              r=0;
要从RGB24转换成RGB565数据还要做移位和或运算:
       RGBdata[1] =( (r & 0xF8) | ( g >> 5) );
       RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
3.2       部分查表法
查表法首先可以想到的就是用查表替代上述整型算法中的乘法运算。
       rdif = fac_1_4075[u];
       invgdif = fac_m_0_3455[u] + fac_m_0_7169[v];
       bdif = fac_1_779[u];
这里一共需要4个1维数组,下标从0开始到255,表格共占用约1K的内存空间。uv可以不需要做减128的操作了。在事先计算对应的数组元素的值的时候计算在内就好了。
对于每个像素,部分查表法用查表替代了2次减法运算和4次乘法运算,4次移位运算。但是,依然需要多次加法运算和6次比较运算和可能存在的赋值操作,相对第一种方法运算速度提高并不明显。
3.3       完全查表法
那么是否可以由YUV直接查表得到对应的RGB值呢?乍一看似乎不太可能,以最复杂的G的运算为例,因为G与YUV三者都相关,所以类似 G=YUV2G[Y][U][V]这样的算法,一个三维下标尺寸都为256的数组就需要占用2的24次方约16兆空间,绝对是没法接受的。所以目前多数都是采用部分查表法。
但是,如果我们仔细分析就可以发现,对于G我们实际上完全没有必要采用三维数组,因为Y只与UV运算的结果相关,与UV的个体无关,所以我们可以采用二次查表的方法将G的运算简化为对两个二维数组的查表操作,如下:
G = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ];
而RB本身就只和YU或YV相关,所以这样我们一共需要4个8*8的二维表格,需要占用4乘2的16次方共256K内存。基本可以接受。但是对于手机这样的嵌入式运用来说,还是略有些大了。
进一步分析,我们可以看到,因为在手机等嵌入式运用上我们最终是要把数据转换成RGB565格式送到LCD屏上显示的,所以,对于RGB三分量来说,我们根本不需要8bit这么高的精度,为了简单和运算的统一起见,对每个分量我们其实只需要高6bit的数据就足够了,所以我们可以进一步把表格改为4个6*6的二维表格,这样一共只需要占用16K内存!在计算表格元素值的时候还可以把最终的溢出判断也事先做完。最后的算法如下:
 
y = (YUVdata[Y1POS] >> 2);
u = (YUVdata[UPOS] >> 2);
    v = (YUVdata[VPOS] >> 2);
   
    r = yv2r_table[ y ][ v ];
    g = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ];
    b = yu2b_table[ y ][ u ];
   
    RGBdata[1] =( (r & 0xF8) | ( g >> 5) );
    RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
 
这样相对部分查表法,我们增加了3次移位运算,而进一步减少了4次加法运算和6次比较赋值操作。
在计算表格元素数值的时候,要考虑舍入和偏移等因数使得计算的中间结果满足数组下标非负的要求,需要一定的技巧:
采用完全查表法,相对于第一种算法,最终运算速度可以有比较明显的提高,具体性能能提高多少,要看所在平台的CPU运算速度和内存存取速度的相对比例。内存存取速度越快,用查表法带来的性能改善越明显。在我的PC上测试的结果性能大约能提高35%。而在某ARM平台上测试只提高了约15%。
3.4       进一步的思考
实际上,上述算法:
    RGBdata[1] =( (r & 0xF8) | ( g >> 5) );
       RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
中的 (r & 0xF8) 和 ( b >> 3) 等运算也完全可以在表格中事先计算出来。另外,YU / YV的取值实际上不可能覆盖满6*6的范围,中间有些点是永远取不到的无输入,RB的运算也可以考虑用5*5的表格。这些都可能进一步提高运算的速度,减小表格的尺寸。
另外,在嵌入式运用中,如果可能尽量将表格放在高速内存如SRAM中应该比放在SDRAM中更加能发挥查表法的优势。
4        RGB2YUV ?
目前觉得这个是没法将3维表格的查表运算化简为2维表格的查表运算了。只能用部分查表法替代其中的乘法运算。
另外,多数情况下,我们需要的还是YUV2RGB的转换,因为从Sensor得到的数据通常我们会用YUV数据,此外JPG和MPEG实际上也是基于YUV格式编码的,所以要显示解码后的数据需要的也是YUV2RGB的运算 8 )运气运气。

转载http://blog.csdn.net/colorant/ 
2014-01-24 09:04:06 TopicDev 阅读数 7503

ISP 是Image Signal Processor 的简称,也就是图像信号处理器。而DSP是Digital Signal Processor 的缩写,也就是数字信号处理器。

ISP一般用来处理Image Sensor(图像传感器)的输出数据,如做AEC(自动曝光控制)、AGC(自动增益控制)、AWB(自动白平衡)、色彩校正、Lens Shading、Gamma 校正、祛除坏点、Auto Black Level、Auto White Level 等等功能的处理。

而DSP功能就比较多了,它可以做些拍照以及回显(JPEG的编解码)、录像以及回放(Video 的编解码)、H.264的编解码、还有很多其他方面的处理,总之是处理数字信号了。个人认为ISP是一类特殊的处理图像信号的DSP。

52RD.com]
 ISP在模组上的应用原理
功能区域
无论数码相机、摄像机或者摄像手机,其影像数据从前端感应后,皆须经过ASP(Analog SignalProcessing)、ADC(Analog-DigitalConverter)、前期影像处理(Pre-ISP)与后端影像处理(Post-ISP)四个阶段后,影像数据才能最终呈现于终端设备上。

但由于图像传感器的像素高低不同、及其他成本等的考虑,ISP各功能区域会依手机市场特性做分散配置或整合处理,例如,低端相机将Pre-ISP与传感器整合在一起,2.0M像素手机将所有的ISP功能单独做成一个芯片等。

 ASP
ASP(Analog SignalProcessor)主要是针对图像传感器采集的电压或电流信号进行处理,主要作用是信号放大、自动曝光调整、时序控制、像素抽样控制等。因其与初始信号的绝对相关性,一般的图像传感器厂商皆会将此项功能直接与传感器做在一块。在图一中即为蓝色部分。传感数据经过ASP处理后,输出数据为RawData。
 Pre-ISP
Pre-ISP(Image SignalProcessor)为前端影像处理,主要针对ADC转换后传出的数字数据(Rawdata),进行影像坏点修补、白平衡、gamma校正、锐利度、颜色插值等。在低像素的产品中,例如0.3M像素,因影像数据较少,不需要大规模的复杂处理,会将Pre-ISP与图像传感器做在同一颗芯片中;但高像素CMOS传感器,因需要处理的像素数越来越多,虽然将Pre-ISP集成在sensor内部从制造技术上来讲不困难,但因成本及成像质量的原因,有些手机设计公司在设计时会将集成于sensor内部的Pre-ISP功能屏蔽掉,并维持传感器ADC输出的原始资料,交由单独的ISP芯片或集成在Baseband的ISP进行处理。
由Pre-ISP处理完后的数据分为RGB和YUV,RGB为三原色,数据比YUV较大,可以方便后续处理单元(Post-ISP)做更为多元的变化;YUV为RGB三原色经内插法所得,数据量较小,但不利于后续的处理单元进行处理。
对于实力强的手机研发公司比较倾向于使用Rawdata数据或者RGB数据,这样可以根据自己的需要调整出更完美的画面质量。Rawdata数据也为以后高端市场的使用方向,但国内现阶段2.0M像素的模组应用还处于初级阶段。因此还是以YUV输出的为主。
 Post-ISP
Post-ISP虽然也称为后端影响处理,但其与成像相关的工作不多,主要负责数据压缩与后端接口界面控制,以及数据传输、控制等工作,其中还包括LCD影像预览、镜头对焦控制、使用界面等。

2010-07-10 15:51:03 cuihuinao1293 阅读数 54

此处纯粹收藏,如有再转,请标明原文出处,以示尊重。

原文出处:上海八中物理组

问题

你想扩展默认的图像内容导入器控制像素,或者你想学习内容管道(content pipeline)。

解决方案

因为XNA已经提供了一个内容导入器将一个图像文件作为源并最终将它创建为一个Texture2D对象,你要做的只是扩展这个内容导入器。本教程中,你可以调用PixelBitmapContent辅助类的ReplaceColor方法,它是由内容管道框架提供的。

注意:如果你只对alpha颜色感兴趣,图像内容处理器会自动将品红色的像素变为透明。本教程主要是介绍如何扩展内容导入器。

工作原理

本教程主要介绍内容管道和如何扩展已经存在的内容处理器,所以,对内容管道的工作流程有所认识是很重要的,如图3-5所示。

内容(素材)管道(Content Pipeline)

在可以使用一个图像文件前,你需要首先加载它,加载过程包括读取字节,选择有用的数据,如有必要还要解压缩数据。

其他素材如3D模型也是如此,模型的数据从一个文件加载后,经过大量的数据处理,基于这些数据创建一个模型对象。

整个处理过程由磁盘上的一个文件开始,最终生成XNA可用的由内容管道管理的对象。事实上,每种素材都有各自的内容管道,如图3-5所示,一个完整的内容管道是由导入器 (importer),处理器(processor),串行化器(serializer)和反串行化器(deserializer)组成的。

图3-5

图3-5 内容管道工作流

在编译时(按F5可以进行编译),源文件会从磁盘读取,它的内容会被处理,最终结果会被串行化至一个. xnb二进制文件。你可以在. exe 文件所在目录的Content子目录下找到这些.xnb文件。当游戏运行时,这个. xnb二进制文件会被反串行化,这样所有有用的信息变得可用而无需进一步的处理。这种方法最明显的优点是所有处理过程只需进行一次(在编译时),而不是在游戏运行时每一次都要进行处理。第二个优点是. xnb文件是平台无关的,你可以同时用在PC和Xbox 360平台上。

让我们分析一下编译过程,因为这个过程在每次编译项目时都会执行,此过程分成三个子过程:

  • 导入器:读取源文件并提取有用的数据,这个数据是存储在一个指定的标准格式中的。例如对一个模型,标准格式是NodeContent对象,对一个图像,标准格式是TextureContent 对象。这种标准格式叫做DOM对象,你可以在表3-1中看到一个默认DOM对象的表格。
  • 处理器:处理包含在DOM对象中的数据并生成在游戏中可用的对象。例如对模型来说,处理器可以添加法线数据,计算切线,设置effect等。
  • 串行化器或TypeWriter:定义了如何从处理器的输出生成.xnb二进制文件。

这种方法的一个额外优点是当你想在编译过程改变点什么,你可能只需改变其中一个子过程。例如,你想创建一个XNA内置不支持的格式的模型,你只需写一个新的导入器,这个导入器读取文件并创建一个NodeContent对象,你可以把其他工作留给默认的内容管道组件,因为NodeContent 的默认处理器会从那儿获取你的对象。

在运行时,只有一个小过程需要被执行:

  • 反串行化器或TypeReader:定义了如何从存储在.xnb文件的二进制数据流中构建游戏对象。因为这里不需要处理计算,相对于编译过程来说这个过程几乎不花费时间。

XNA自带了很多默认内容导入器和处理器。组合TextureImporter和TextureProcessor,你可以导入几乎任何图像格式。组合Ximporter或FbxImporter和ModelImporter,你可以导入. x 或. Fbx模型。

注意:分离导入器和处理器被证明很有用。Ximporter和FbxImporter都能从磁盘导入数据并将它们格式化为一个简单的NodeContent对象,这两种情况中都传递到ModelProcessor,由ModelProcessor进行繁重的工作。

表3-1 XNA Framework中的默认内容导入器和处理器

内容导入器 输入(文件) 输出(DOM对象)
TextureImporter bmp, .dds, .dib, .hdr, .jpg, .pfm, .png,. ppm, . tga TextureContent
XImporter .x NodeContent
FbxImporter . fbx NodeContent
EffectImporter . fx EffectContent
FontDescriptionImporter .spritefont FontDescription
XmlImporter .xml User-defined
XACT Project .xap Audio project

内容处理器 输入(DOM对象) 输出(Game OM)
TextureProcessor TextureContent TextureContent
ModelProcessor NodeContent ModelContent
EffectProcessor EffectContent CompiledEffect
PassThroughProcessor Any Any
FontDescriptionProcessor FontDescription SpriteFontContent
FontTextureProcessor TextureContent SpriteFontContent
FontTextureProcessor Texture2DContent SpriteFontContent

XNA内容管道带有在编译时将这些对象写入二进制文件的默认串行化器和运行时从一个二进制文件重建对象的反串行化器。化器。

使用默认内容管道框架的组件

写入/扩展一个内容处理器的关键是尽可能地复用已经存在于内容管道中的组件。

本教程中,你将扩展默认TextureProcessor使你可以在图像数据加载到XNA项目之前对它做出改变。在编译时,想从文件读取图像,将内容存储在一个2D数组中形成图像,你还想改变一些像素并将结果放在一个.xnb文件中。

当运行程序时,.xnb文件会从文件读取,并包含了你施加的改变。

首先,从磁盘读取文件并将它们转换为一个2D的颜色数组(无论图像文件的格式是什么),你应该使用默认的导入器。

然后,你需要扩展TextureProcessor。因为本教程关心的是如何设置一个自定义的内容管道,所以你只需将所有的黑色变成白色。更高级的应用请见下一个教程。

你要确保处理器的输出是一个TextureContent对象,这样你可以使用默认的串行化器将它保存为. xnb文件并可以使用默认反串行化器加载这个. Xnb文件。

图 3-6显示了整个过程。找到你将扩展的处理器,和从XNA中借用的默认组件。

图3-6

图3-6 你将重写的内容管道处理器的位置

本书中,每次当你处理内容管道时我都会显示一张类似于图3-6的图片,这样你可以清楚地知道你将自己处理哪一部分。扩展一个已存在的内容处理器要扩展一个已存在的内容处理器,需要先进行几个步骤。虽然这些步骤对于一个有经验的.NET 程序员来说是很简单的,我还是将它们罗列出来,以后的教程中你可以参考这些步骤,本章接下来的部分会解释这些步骤。

  1. 在解决方案中添加一个新的内容管道项目。
  2. 在新项目中,添加对Microsoft.XNA. Framework.Content. Pipeline的引用。
  3. 添加管道命名空间。
  4. 指定要扩展的部分(即你要复写的方法)。
  5. 编译新的内容管道项目。
  6. 在主项目中添加新建的这个项目的引用。
  7. 对素材选择新建的处理器。
  8. 设置项目依赖项。
  9. 初始化所有东西后,在第4步中创建的方法中编写代码。

在解决方案中添加一个新的内容管道项目

要扩展或创建一个新的内容导入器/处理器,你需要在解决方案中添加一个新项目。右击你的解决方案选择Add→New Project,如图3-7所示。在弹出的对话框中,选择Content Pipeline Extension Library并起一个合适的名称,如图3-8所示。

图3-7

图3-7 在解决方案中添加一个新项目

图3-8

图3-8 创建一个content pipeline extension library

项目中有一个新文件,包含了你定义的命名空间,还包括一个默认的Processor类。新项目已经添加到了解决方案中,如图3-9所示。

图3-9

图3-9 添加到解决方案中的Content pipeline项目

添加对Microsoft.XNA.Framework.Content.Pipeline的引用

在新项目中,确保对Microsoft. XNA. Framework. Content. Pipeline (version 2.0.0.0)的引用。打开Project菜单选择Add Reference。从列表中添加正确的引用,如图3-10所示。

图3-10

图3-10 选择XNA pipeline引用

使用代码块添加Pipeline的命名空间

你还要使编译器链接到新的命名空间,添加下列代码块:

using System.IO; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.Content.Pipeline; 
using Microsoft.Xna.Framework.Content.Pipeline.Graphics; 
using Microsoft.Xna.Framework.Content.Pipeline.Processors; 
using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler; 

指定要扩展的部分

文件已经包含了一个ContentProcessor的模板,用以下代码替换这些代码,指定新处理器的输入和输出。所有这些自定义处理器使用它的基类(默认纹理处理器)处理输入,所以这个新ContentProcessor工作方式与默认纹理处理器是一样的:

namespace MyImagePipeline
{
    [ContentProcessor(DisplayName = "ExtendedExample")] 
    public class ExtentedTextureProcessor : TextureProcessor 
    {
        public override TextureContent Process(TextureContent input, ContentProcessorContext context) 
        { 
            return base.Process(input, context); 
        }
    }
}

本教程中我们将扩展默认TextureProcessor,所以你需要从TextureProcessor类继承。由于这个原因,你的Process方法接受一个TextureContent对象并将一个TextureContent对象作为输出。

等一会儿你将编写一个真正的Process方法,但现在这个方法只从默认TextureProcessor类继承。

注意:ExtendedExample是你的新自定义处理器的名称。如果你省略了DisplayName标签,你的处理器会使用类的名称,本例中是ExtendedTextureProcessor。

注意:请确保将这个DisplayName放在[ContentProcessor]中。如果不是,XNA不会把这个类当成内容处理器。结果是当浏览可用内容处理器列表时你的处理器不会显示。

编译新的内容管道项目

在下一步你要将这个新项目的引用添加到主项目中,所以你需要首先编译这个项目。按F6可以进行编译,而按F5会编译并运行整个解决方案。

注意:这个编译过程要花几秒钟的时间;你可以在窗口的左下角看到这个处理过程的信息。

将新建的引用添加到主程序中

编译了自定义处理器后,你还需要将它应用到主程序中。在解决方案中找到Content,右击References并选择Add Reference,如图3-11所示。

图3-11

图3-11 添加到自定义内容管道项目的引用

在弹出的对话框中,找到Projects选项卡,并从列表中选择你的内容管道项目,如图3-12所示。

图3-12

图3-12 选择内容管道项目

注意:如果内容管道项目不在列表中,你肯定遗漏了前面的编译步骤。

选择新建的处理器处理一个图像文件

当你将一个图像文件导入到项目中时,你可以选择新建的内容处理器处理这个图像文件,如图3-13所示。

图3-13

图3-13 选择自定义的内容处理器处理图像

现在当你编译项目时,你的自定义处理器就可以用来处理图像文件了!

设置项目依赖项

你对自定义内容处理器进行的每次改变都需手动重新编译项目。要解决这个问题,你可以让主项目依赖于内容管道项目,这样当你每次重新编译主项目时,内容管道项目会首先编译(如果在上次编译后你进行了某些改变)。你可以通过右击主项目选择Project Dependencies设置依赖项。在弹出的对话框中,你需要选择主程序依赖于第二个项目,如图3-14所示。这样,当你按F5编译主程序时,内容管道项目的. dll文件会首先被编译。

图3-14

图3-14 选择项目依赖项

扩展默认纹理处理器

现在所有东西都进行了初始化,你可以编写自定义代码了。

你已经创建了一个ExtendedTextureProcessor类,这个类从默认的TextureProcessor类继承,你也声明了将复写Process方法。所有内容处理器这个方法都叫做Process并接受一个DOM 对象(在TextureProcessor的情况中是TextureContent对象,如表3-1所示) 和一个ContentProcessorContext对象作为参数。这个context对象用来创建多个生成(nested builds)。例如,当导入一个Model时,这个对象会包含所有纹理文件的名称,这些名称也需要和模型一起被加载,在教程4-12可学到更多这方面的知识。

如表格3-1所示,在TextureProcessor情况中,你需要返回一个TextureContent对象。这种情况中纹理作为处理器的输入和输出,现在的处理器只是将输入传递到基类中:

[ContentProcessor(DisplayName = "ExtendedExample")] 
public class ExtentedTextureProcessor : TextureProcessor
{
    public override TextureContent Process(TextureContent input, ContentProcessorContext context) 
    {
        return base.Process(input, context); 
    }
} 

这一步使用TextureProcessor 类的Process方法处理输入(因为你从默认的TextureProcessor 类继承而来)并返回结果图像,所以这也做好了扩展这个处理过程的准备。直到现在,你只是简单地将输入直接传递到输出,所以你的处理器会获得和默认TextureProcessor同样的结果。

注意:这种情况下的TextureProcessor是特殊的,因为输入和输出对象的类型是一样的。在更复杂的情况下,你想让base. Process方法可以将输入对象转换为一个输出模型。例如,如果你扩展了模型处理器,你会首先让base. Process方法将输入的NodeContent对象转换为一个ModelContent对象,这包含大量的工作。一旦你有了默认的ModelContent对象,你就可以方便地扩展/改变它们。可见教程4-12学习一个扩展模型处理器的例子。

在本教程中,你不想让输入立即传递到输出,你想改变一些颜色值。使用标准DOM对象的一个好处是你可以使用已经定义好的默认内容管道。例如,TextureContent类有一个有用的ConvertBitmapType方法可以改变纹理内容的格式,下面的代码改变了texContent 对象内容的颜色:

TextureContent texContent = base.Process(input, context);
texContent.ConvertBitmapType(typeof(PixelBitmapContent)); 

因为TextureContent类是抽象类,如果是一个2D图像,texContent对象会实例化为一个TextureContent2D对象(也可以是一个TextureContent3D或TextureContentCube对象)。这意味着一张图像可以有多个face和多个mipmap (可见教程3-7了解mipmap的知识)。下面的代码选择第一个face和第一个mipmap,一个简单的2D纹理只有一个face一个mipmap level。

PixelBitmapContent image = (PixelBitmapContent)input.Faces[0][0]; 

PixelBitmapContent类有一个有用的ReplaceColor方法,这个方法可以将图像中指定颜色替换成另一个颜色:

Color colorToReplace = Color.Black; 
image.ReplaceColor(Color.Black, Color.White); 

这就是你的自定义处理器所做的工作,最后返回TextureContent对象:

return texContent; 

在编译过程中,这个对象会被传递到串行化器,串行化器将这个对象保存为二进制文件。在运行过程中这个二进制文件有反串行化器加载并创建一个Texture2D对象。现在确保在XNA项目中导入一个图像,选择自定义处理器处理这张图像,并在LoadContent方法中加载这个Texture2D对象:

myTexture = Content.Load("image"); 

多个Face/Mipmap

本例中你从TextureContent处理器继承,这个处理器会生成mipmap (可以代替SpriteTextureProcessor)。关于mipmap的更多信息可见教程3-7。如果导入的图像是一张立方图像,那么这个纹理有六个面。要使教程完整,还需要遍历face和mipmap的代码:

for (int face = 0; face < texContent.Faces.Count; face++) 
{
    MipmapChain mipChain = texContent.Faces[face]; 
    for (int mipLevel = 0; mipLevel < mipChain.Count; mipLevel++)
    {
        PixelBitmapContent image = (PixelBitmapContent)input.Faces[face][mipLevel]; 
        image.ReplaceColor(Color.Black, Color.White); 
    }
} 

Faces属性的第一个索引是图像的face。标准2D图像只有一个face,而立方纹理有六个 face。第二个索引是mipmap level,不使用mipmapp的图像只有一个level。这个代码对纹理的每个face的每个mipmap level将你选择的颜色(本例中是黑色)变成白色(译者注:实际代码中是将小女孩蓝色的头发替换成黄色)。

代码

下面是扩展默认内容处理器的所有代码,记住要使代码正常工作,你需要在新项目中添加对Microsoft.XNA. Framework. Content. Pipeline的引用。

using System; using System.Collections.Generic; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Content.Pipeline; 
using Microsoft.Xna.Framework.Content.Pipeline.Graphics; 
using Microsoft.Xna.Framework.Content.Pipeline.Processors; 
using System.IO; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler; 

namespace MyImagePipeline
{
    [ContentProcessor(DisplayName = "ExtendedExample")] 
    public class ExtentedTextureProcessor : TextureProcessor 
    {
        public override TextureContent Process(TextureContent input, ContentProcessorContext context) 
        {
            TextureContent texContent = base.Process(input, context); 
            texContent.ConvertBitmapType(typeof(PixelBitmapContent)); 
            
            for (int face = 0; face < texContent.Faces.Count; face++) 
            { 
                MipmapChain mipChain = texContent.Faces[face]; 
                for (int mipLevel = 0; mipLevel < mipChain.Count; mipLevel++) 
                { 
                    PixelBitmapContent image = (PixelBitmapContent) input.Faces[face][mipLevel]; 
                    image.ReplaceColor(Color.Black, Color.White); 
                }
            } 
            return texContent; 
        }
    }
} 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21146222/viewspace-667713/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21146222/viewspace-667713/

2011-12-20 15:19:35 learneryql 阅读数 1974

       RIP,全称光栅图像处理器。在彩色桌面出版系统中的作用是十分重要的,它关系到输出的质量和速

度,甚至整个系统的运行环境,可以说是彩色桌面出版系统的核心。RIP的主要作用是将计算机制作版面

中的各种图像、图形和文字解释成打印机或照排机能够记录的点阵信息,然后控制打印机或照排机将图像

点阵信息记录在纸上或胶片上。

  RIP也是直接体现系统开放性的关键,因此RIP是否符合PostScript标准,关系到是否能对各种应用软

件生成的PS文件进行解释,是否能够支持汉字,是否支持各种硬件平台。图像的加网也是在输出过程中由

RIP完成的,加网有很多不同的算法,各RIP生产厂家都有自己的加网算法,如连诺.海尔公司的HQS加网、

爱克发公司的平衡加网、Adobe公司的精确加网等。但不同的算法会产生不同的效果,加网速度有很大差

别,生成的网点玫瑰斑形状也不一样,这主要是由于加网线数和网角以及点形的微小差别造成的。这些加

网线数及输出设备的分辩力,图像的分辨力及输出产品的层次间有紧密的关系。要想加网角度准确,加网

线数接近标称数值,往往要花费很大的计算代价,解释速度也就相应降低。因此RIP的加网算法直接影响

到图像的质量和输出的速度。

RIP的主要技术指标

  ①PostScript兼容性。因为PostScript页面描述语言已经成为印刷行业的通用语言,各种桌面系统应

用软件都以此为标准,因此兼容性的好坏直接关系到RIP是否能解释各种软件制作的版面,输出中是否会

出现错误。

  ②解释速度。解释速度是用户最关心的问题之一,因为它直接关系到生产的效率。但输出的整体速度

还取决于照排机的记录速度和网络传递速度,所以最好应该综合地考查系统的速度。

  ③加网质量。加网是RIP的重要功能,加网质量直接影响印刷品的质量,在制作彩色印刷品时非常重

要。有些印刷品在某些颜色的层次上网点显得很粗,视觉效果不好,而在另一些层次上则不明显,这就是

RIP加网算法造成的。加网质量与解释速度是一对矛盾,精细的加网算法计算量增加很多,速度降低也很

大。

  ④汉字的支持。支持汉字对于我国来说是一个起码的必要条件,目前的RIP已经不成问题,但有些老

系统的RIP可能还确实存在这种困难。

  ⑤操作界面和功能。各种RIP的功能各不相同,可能有些差别还很大。

  ⑥支持网络打印功能,可以令使用非常方便,更重要的是,可以在不同的硬件平台之间使用,也就是

现在常说的跨平台系统。

  ⑦预视功能,可以用来检查解释后的版面情况,避免出现错误和减少浪费,因此现在大部分情况下都

要先预视检查,预视功能也就成为了一项必不可少的功能。

  ⑧拼版输出功能,可以更有效地利用胶片,提高工作效率。因为照排机的胶片宽度是固定的,而输出

的版面却是千变万化的,往往会遇到用很宽的胶片来输出很小版面的情况,尤其是大幅面照排机更容易遇

到这种情况,造成胶片的浪费,而使用具有拼版输出功能的RIP就可以使这种问题迎刃而解。但目前具有

拼版输出功能的RIP还不普遍,只有较新版本的产品才有这种功能低。因此RIP的加网算法直接影响到图像

的质量和输出的速度。 

硬件RIP和软件RIP的比较

  RIP通常分为硬件RIP和软件RIP两种,也有软硬结合的RIP。硬件RIP实际上是一台专用的计算机,专

门用来解释页面的信息。由于页面解释和加网的计算量非常大,因此过去通常采用硬件RIP来提高运算速

度。软件RIP包括软件主体和各种设备驱动程序。软件主体实现光栅化,形成的图像文件有特定的设备驱

动程序送到相应的外部设备进行输出。软件RIP是通过软件来进行页面的计算,将解释好的记录信息通过

特定的接口卡传送给照徘机,因此软件RIP要安装在一台计算机上。目前计算机的计算速度已经有了明显

的提高,RIP的解释算法和加网算法也不断改进,所以软件RIP的解释速度已不再落后于硬件RIP,甚至超

过了硬件RIP。加上软件RIP升级容易,可以随着计算机运算速度的提高而提高,因此越来越受到用户的欢

迎。

  硬件RIP的工作方式一般比较简单,通常采用网络打印方式,没有预视功能;而软件RIP接收页面数据

的方式比较灵活,可以有网络打印方式,也可以直接解释由组版软件形成的PS文件,还可以采用批处理的

方式解释PS文件。

  所谓网络打印方式是指,将RIP设置成一台网络打印机,在各台工作站上可以按照选择网络打印机的

方法来连接,由组版软件打印的数据直接通过网络送RIP进行解释,然后送照排机输出。这种方式是最简

单方便的输出方式,只要是连接在网络上的工作站,都可以直接进行打印。这种输出方式的缺点是占用工

作站的时间较长,可以采用后台打印的方式加快脱机速度。

  解释PS文件的方式稍微复杂一些。首先要用组版软件将版面打印成PS文件,通过网络传送给RIP或将

PS文件放到批处理文件夹里,最后由RIP打开PS文件解释输出。很多软件RIP都采用这种输出方式,尤其是

早期的软件RIP,网络打印功能很弱,只能通过这种方式输出。

  批处理输出方式是将欲输出文件全部打印成PS文件,并放在同一个文件夹里,由RIP按顺序自动输出

。这种方式比较适合相同处理条件时的作业,但这种方式不能预视输出结果,所以要确认版面制作没有问

题。

  国内使用的彩色桌面出版系统中,进口的RIP仍然占多数,有很多RIP是与照排机捆绑在一起销售的。

如爱克发公司的照排机与爱克发的Viper软件RIP或Star 800硬件RIP配套,连诺.海尔公司(现在属海得堡

公司)的照彩排机与该公司的RIP 50,硬件RIP或软硬混合型的Delta RIP配套等。在各种软件RIP中,

Harlequin RIP以其优秀的性能、非常高的解释速度和适应多种照排机等特点,占据了软件RIP的绝对优势

,占领了软件RIP的大部分份额。值得一提的是,Delta RIP以其非常好的性能和独特的设计思路,成为很

有代表性的RIP。这种RIP采用了列表技术。由软件对页面进行解释,利用硬件进行加网和输出,提高了输

出的速度,而且还可以实现一次解释,多次输出。

  相对于照排机等硬件设备来说,我国对RIP的研究和开发与国外的差距要小得多。目前,国内已经开

发出了商品化的软件RIP,其中比较有影响的是北大方正的世纪RIP、华光集团在PowerPC平台上开发的软

件RIP和北京印刷学院开发的佳盟软件RIP。

RIP的功能

  现在,随着大幅面图文照排机和CTP(computer-To-Plate)的推出,RIP的功能在不断在加强;如拼大

版、大版打样、最后一分钟修改、预视、预检、光栅化、成像等的处理,现已包括在RIP之中。有的RIP还

涉及到印后装订,少数RIP还能把涉及到网点、油墨的一些印刷数据传送给印刷机。由于RIP的速度跟不上

图像输出机的处理速度,出现了Multi-RIP,用于多个RIP并行上作。现在,RIP用于处理更多的输出任务

,RIP变的举足轻重,成为执行各项输出功能的智能服务中心。因此,在建立一个出版系统时,选择合适

的RIP是十分关键的。

  DTP对RIP的要求越来越高,特别是CTP的出现,更使RIP变的举足轻重,要求RIP有如下功能:

  ①补漏白(Trapping);RIP与相应的补漏白软件配合一起,可解决彩色印刷中套色不准的问题。

  ②拼大板(Imposition);根据出版物排版及装订要求把单个页面组拼成书帖大版。

  ③自动分色(Separations);

  ④最后一分钟修改;有时在制作印版前需对某一个页面修改,为避免重新RIP处理整张大版,要求RIP

只对这个页面做修改后的处理。

  ⑤RIP一次,输出多次;即经RIP处理后的同一数据,可同时供给印前打样与最后成品输出使用,并要

求RIP能根据不同输出设备输出不同分辨率。使数字式印前打样与最后成品输出使用同一RIP,保证打样样

张与最终成品的一致。

  ⑥广泛的设备支持能力;支持当地市场的主流输出设备,为用户提供更多的配置系统的灵活性和选择

余地,最大限度地利用系统所提供的功能;

  ⑦RIP与CTP系统整体解决方案无缝连接:支持数字打样系统、支持色彩管理系统、支持自动流程管理

系统等;

  ⑧开发多功能RIP,从低端黑白校样设备、彩色数字打样设备到高精度直接制版设备都能同时驱动,

充分发挥RIP性能;同时保证系统内各种输出结果的高度一致性,减少差错机会;开发新的网点技术,用

低分辨率输出高网线,节约输出时间;支持更加友好的人机界面和远程监控RIP能力等等。

   ⑨支持系统分级权限管理等,提高可靠性。

RIP的解释方法

  RIP的解释方法可分为两种:NORM方法及ROOM方法。

  (1)NORM--Normalise Once Render Many(解释一次,着色多次)。指的是对于文件中

PostScript语言命令所描述的全部数据,先全部解释完,再一个页面一个页面着色。这种方法可解释PDF

格式或其它格式的文件,可为以后的操作(比如定义陷印、OPI、拼版等)打下基础。Agfa公司是这种方

法的倡导者,开友了Adobe Normaliser技术的一个版本,可为Agfa的Apogee数字化工作流程生成PDF文件

  Harlequim及Barco Graphic公司所采用的方法,与NORM方法有些差异。他们的图文数据被解释完后,

并不马上着色。例如, Harlequin RIP可生成一个解释好的文件,然后可被加上其他模块(如陷印、色彩

管理等)。最好地应用这项技术的是Purup-Eslofot公司的New Age RIP,用来驱动他们的照排机及直接制

版机。

  (2)ROOM--Render Once Out Many(着色一次、输出多次)是由Scitex公司首先提出的。指的是

对于文件中PostScript语言命令所描述的全部数据,先全部解释并着色完,再一个页面一个页面地输出。

达也是海德堡公司Delta RIP所采用的方法,解释文件,并生成一小压缩的连续调光栅化文件。ROOM最主

要的优点是在不同的输出设备上可保证输出的一致性,因为文件已经被着色过了。

  但是因为ROOM方法用的都是解释过且着色过的文件(虽然还没有加网),文件较大,不利于网络传输

。而且在打样时需压缩数据,很难保持数据一致性。尽管RIP的实现方法有些不同,大家都认为RIP还应具

有以下功能,如用工作票拼版,OPI(显示时使用低分辨率图片,而在输出时替换为高分辨率图片的一种

处理方法)及陷印等。

计算机加网技术

  作为RIP中的一项重要技术,计算机加网算法的好坏直接影响着印刷复制质量,本文主要对计算机随机

加网、调幅加网及混合加网算法详细介绍。

  (一)随机加网

  随机加网一直是倍受关注的加网技术,其主要特点是层次再现好,图像细腻,分辨率高,特别适用于彩色

喷绘、彩色预打样等直接转印设备。但是,由于生成的点子小不易控制,这种加网在常规平版印刷中推广有

一定难度。随机加网的基本算法如下所述:

  设原始图像分辨率为m,二值输出设备分辨率为n, f(x, y)为原始图像坐标空间中(x, y)坐标处的图像

采样点值,g(x, y)为设备坐标空间中(x, y)坐标处的曝光点值。Rand (t)为时刻t的随机数,则有:

  g(x, y)=1, 如果 f (x×m÷n, y×m÷n) ≥rand (t)=0,如果f (x×m÷n, y×m÷n) <rand (t)

  式中,rand (t)为平均分布的伪随机函数,取值范围[0,1];f(x, y)取值范围[0,1]。因此,其加网结果

表现为曝光点间的平均点距与图像采样值成正比,故又称为调频加网。

  然而,用这种简单的算法并不能达到满意的效果。在该种算法中,伪随机数的产生是其关键。虽然曾分

别使用过平方取中法,乘法取中法,线性同余法等多种算法,却都未能取得满意的效果。其原因在于:无论

怎样产生随机数,但由于最大点距和最小点距不受控制,使所生成的图像都存在网点不规则聚集现象(如下图):

渐变网在随机加网中出现的网点

 

图像在随机加网中出现的网点

  不规则聚集现象不规则聚集现象纯理论上的随机加网算法是行不通的。事实上,所有的随机加网算法,

都采用受控随机加网技术。

  (二)调幅加网

  计算机调幅加网与电分机电子加网技术基本相同。由于其使用历史久远,工艺配套好,仍为当前广泛采

用的主流加网技术。调幅加网算法也是最成熟的加网算法,HQS精密有理加网算法和IS无理加网算法依然为

RIP中应用最广的加网算法。但是,由于软件实现的特殊性,计算机调幅加网也有其相应的优缺点。下面仅

就其算法的关键之点进行讨论。

  (1)15°网角的产生tan15°的值为无理数,因此15°网角的产生有一定难度。现常使用有理加网算法,

通过选取m和n使m/n的值接近tan15°的值,并利用超细胞结构加以实现。当m和n的取值大于页面宽度时,即

为无理加网。

  (2)网点模型的产生现常使用的方法有两种。其一是固定网点模型法,即先计算好网点模型,将其存于

网点模型库中。该方法可以精细调整网点形状,使其结构最佳。其二是用网形函数产生点形。Adobe公司

PostScript RIP中的基本算法即已采用,首先建立spot function,然后通过set screen等函数设定网点形

状。

  (3)网点形状的精细调整网点形状调整算法是调幅加网技术中的一个难点,它的作用是调整各阶调的点

形,使网点形状更加圆润。由于采用超细胞结构生成15°网角,而超细胞内各网点的中心位置和大小又不同

,这使得网点形状的精细调整更显重要。

  (4)摩尔条纹的消除虽然通过计算选取各色版的加网角度和加网线数能消除低频干涉条纹(即龟纹),但

高频干涉条纹(即玫瑰斑)仍然影响着版面加网复制的视觉效果。因此,消除干涉条纹是调幅加网技术的另

一难点。由于玫瑰斑的形成受网点层次、网点形状,加网角度、加网频率,叠印等诸多复杂因素的影响,尚

难以完全用数学方法加以解决。解决它应以实验方法为主,数学分析方法为辅。

  (5)层次再现与分辨率调幅加网是采用周期函数对原始图像进行调制处理。根据仙农定理,原始图像与

加网频率之间的关系为:

r图像=2×r加网频率

  但是,并不能简单地用该公式分析这二者之间的关系,因为调幅调制系统中的低通滤波器是人的视觉系

统。人眼并不能滤除网点,故加网对图像的影响就变得很突出。此外,调制函数并不是模拟量,这就使得再

现分辨率受到原始图像振幅的影响。当原始图像为二值图像时,再现的最高分辨率为输出设备分辨率。正

因为层次再现能力受到网点模型大小的限制,进一步导致了设备再现能力的下降。与随机加网相比,调幅加

网印刷品较调频加网印刷品的分辨率低,层次再现能力差。

  (三)混合加网

  由随机加网算法可知,随机加网仍然以网点模型为基础。当以调幅网点模型为限定条件时,混合加网的

加网特性便兼具调幅加网和随机加网的双重优点。既具有调幅加网印刷适性好的优点,又具有调频加网层

次再现丰富的优点。由于能较充分地发挥输出设备的功能,成为当前普遍采用的一种加网算法,并且成为

AdobePostScriptLevel3中的标准技术。

RIP的发展趋势

  支持最新PostScript版本:当前是PostScript 3; PostScript 3在PostScript Level 2基础上增补

了以下内容:陷印(In-RIP Trapping)渐变(Smooth Shading)多种格式字体支持(Font)增强的设备

控制能力(Device Setup)等;

  符合PostScript 3的RIP将会对陷印、渐变以及高保真色彩提供直接的支持,增强了排版软件描述复

杂版面的能力以及RIP输出复杂渐变版面的速度;

  支持最新可携带文档格式:PDF{Portable Document Format};

  支持最新软硬件平台(如64位硬件平台以及Windows NT5.0等),尽可能发挥操作系统平台的性能,

提高RIP输出速度;

  提供跨平台支持能力,不仅能够处理MAC、PC平台输出任务,同时可以接受来自UNIX等其它平台的输

出请求;

  支持PDF为核心的自动输出流程管理系统,开发提高系统可靠性、可操作性和生产效率;

  支持对打印任务的预警(Pre Flight)功能;

  支持在多个RIP和输出设备之间智能化分配作业,提高系统吞吐率;

  允许用户查询输出系统(打印任务、RIP和输出设备)状态,

  支持用户远程对输出系统(打印任务、RIP和输出设备)进行监控;

  提供报表功能;

  支持OPI(Open Interface)。

 

2019-08-21 13:47:13 weixin_39579513 阅读数 850

本文来自对论文《Reconfiguring the Image Pipeline for Computer Vision》的附录关于ISP内容的整理。 

从数码单反相机到智能手机,现代的任何照相机都遵循这一套标准的pipeline,下图展示了这一套传统的pipeline。主要成分有图像传感器,其对光作出反应并产生出RAW格式的图像;图像信号处理器(ISP)单元,它把图像信号进行转换、增强、压缩等一系列操作,产生一个完整的图像,通常是JPEG格式;以及视觉应用自身。下面会详细讲每个部分。

一、相机传感器

第一步是把捕捉到的场景由光转换为电的形式,图像传感器CCD和CMOS使用的固态设备都能够利用光电效应把光转换为电压。大多数现代设备都使用CMOS传感器。现代手机的传感器的尺寸能达到1.1μm。

CMOS的光电二极管对可见光有一个较宽的光谱感知范围,但只能感知单色光的强度。因此为了捕捉到色彩信息,传感器加上了光电二极管大小的滤波器来允许特定波长的光通过。每个光电二极管因此被分配感知一种特定的颜色:一般来说是红色、绿色和蓝色。这些滤波器构成的布局叫做马赛克(mosaic)。最常见的马赛克是Bayer滤波,如下图所示,它是一个由一个红色像素、一个蓝色像素和两个绿色像素构成的2x2模式。之所以绿色数量是其余的两倍,是为了模拟人眼视觉系统,后者对绿色的波长更为敏感。

在捕捉颜色期间,相机读取传感器的一行,其中每个像素的电压值都按列级进行放大(这儿没太明白作者的意思-。-),然后用一个ADC进行量化。帧率决定了相机用在读和量化一张完整图片上的时间。这一部分最终形成一个RAW格式的图像,并将其传入ISP进行下一步的处理。

二、图像信号处理器ISP

ISP负责将RAW数据转换为最终的压缩后的图像,一般为JPEG文件。ISP存在一系列的信号处理过程,旨在使图像在视觉呈现上较为美观。接下来会描述该阶段通常的一些处理过程,尽管对不同的ISP可能存在个体差异。

(2.1)去噪

RAW图像的噪声来源分为三类:shot noise,是由于光探测的物理特性;存在像素中的thermal noise;来自读取过程的read noise。ISP通常使用例如BM3D和NLM的去噪算法,来提高图像的SNR(一个评价去噪性能的指标),同时注意不能模糊掉一些例如边缘和纹理的图像的重要特征。去噪算法是很昂贵的,因为他们会利用上空间信息,这一点在低照度的场景下尤其困难。

(2.2)去马赛克

这一阶段旨在弥补图像传感器阶段得到的马赛克图像。在Bayer阵列中,RAW图像中的每个像素包含了红色、蓝色或者绿色中的任意一种,在相机的输出中,每个像素得包含三个通道。去马赛克算法旨在通过邻近像素来插值补充缺失的颜色通道,简单的插值算法比如最近邻或者平均法会导致边缘模糊及其他失真,所以一些更先进的去马赛克算法会使用基于梯度的信息来帮助边缘信息的保留。

(2.3)色彩变换和伽马映射

色彩变换一系列的操作是把图片变到一个视觉美观的颜色空间中去。这些色彩变换是局部的,是针对每个像素的单独操作,由一个3*3的矩阵乘法来完成。对一个给定的像素p\in \mathbb{R}^{3},一个线性的色彩变换是一个矩阵乘法:p^{'}=Mp,其中M\in \mathbb{R}^{3\times 3}

第一个色彩变换是色彩映射白平衡。色彩映射减轻了绿色通道的强度去匹配蓝色和红色,以及对艺术效果进行了修正。白平衡调整了图像的色温,以去匹配场景的光线情况。这些色彩变换的矩阵的值是由每个相机厂商自己设定的。

第二个色彩变换是伽马映射。伽马映射旨在把可展示色彩范围之外的色彩值(但人类视觉仍可感知)转换到可展示色彩范围内。伽马映射,不同于之前的阶段,它是非线性的(但仍是针对单个像素的操作)。ISP也可能把图像转换到一个非RGB的色彩空间,比如YUV或者HSV。

(2.4)色调映射

色调映射是一个非线性的、针对单个像素的操作。它能够压缩图像的动态范围,以及增添一些艺术效果。通常来说,该过程会调整得到更据美学效果的视觉对比度,使黑暗的区域更加明亮同时不使明亮的区域过曝或者饱和。一种类型的全局色调映射叫做伽马压缩,它是在YUV色彩空间中把像素p的luminance通道进行变换:p'=Ap^{\gamma },其中A> 0并且0< \gamma < 1。但是,大多数现代的ISP,使用计算量更加昂贵的,基于对比度或者梯度域的方法的局部色调映射,来增强图像质量,尤其应用于高动态范围的场景比如户外和强光场景。

(2.5)压缩

压缩不仅能够降低对存储量的要求,还能够减少芯片间的数据传输量。在大多数系统中,图像传感器、ISP和应用这三部分在物理分离的集成电路中,所以他们之间的交流需要耗费昂贵的传输。

最常见的图像压缩标准是JPEG,它针对高频空间信号的稀疏性,使用离散余弦变换量化。其余算法,比如JPEG 2000,使用小波变换,但思想也是相同的:为低频信息分配更多的空间,同时忽略高频信息,来达到牺牲细节换取空间效率的目的。该JPEG算法通常在物理上被实例化为ISP上专用逻辑块的编解码器。