显示标签为“光学”的博文。显示所有博文
显示标签为“光学”的博文。显示所有博文

2011年5月27日星期五

数码单反(DSLR)相机raw格式图片的读取和处理

随着消费用数码单反(DSLR)相机成本的下降和性能的提升,在很多要求不太高的科研场合DSLR相机可以用作昂贵的高档CCD数码相机的替代品。现在最新的数码相机可以提供14位A/D转换,而动态范围可以到达11档光圈以上【参考链接:12】,很多时候这已经可以满足要求了。一般摄影爱好者使用的JPEG图片格式只能存储8位的层次,而且JPEG图片压缩过程中会有失真,所以作为科研使用的DSLR相机必须使用raw图片格式。

一般各个消费用相机厂商都使用自己专有的raw格式,所以处理起来不像科研级相机那么直接。dcraw是一个Linux平台上的能将各主要品牌相机的raw格式图片转为Netpbm格式图片的小工具。Netpbm提供了一些工具软件,另外很多图像处理软件也包含对Netpbm格式的支持,所以可以在此基础上对图片进行进一步处理。

很多时候我们可能希望自己写代码来处理图片,因为:
  1. 很多图像处理软件只支持8位(或24位RGB)而不支持16位图片;
  2. 科研上用到的算法大都比较复杂,现有的软件不满足需求。
Netpbm可以把图片存成二进制文件或者纯文本(ascii)文件。无论哪种方式,开始的几行都是标识文件格式的纯文本信息,后面跟着是文件内容。

纯文本文件的好处是数值大小一目了然,但是文件比较大。二进制文件比较小,但是处理的时候需要注意:Netpbm存储文件时使用的是Big-endian方式,而一般x86机器都是使用Little-endian方式,所以在读取数据时要进行转换。glibc的endian.h提供这样的转换函数。二进制文件存储顺序是从上到下按行存储,每行内按从左到右顺序存储。

dcraw转换图片时默认使用8位方式,如果要使用16位方式,需要使用参数 -6

2008年11月21日星期五

Mie散射计算器

Mie散射理论为球形颗粒对于电磁波的散射提供了一套严格解,其数值计算十分复杂。Bohren和Huffman的书里提供了用于数值计算的Fortran代码。另外,Oregon Medical Laser Center的网页提供了一个在线的Mie散射计算器,可以快速的计算出一些常用参数,并且给出一些图线。

2008年11月10日星期一

光圈档数(aperture stop)的计算方法

摄影的时候计算曝光量经常用到几“档”曝光这个术语。这个曝光的“档数”(stop)也经常被称作EV(exposure value)。这个“档数”到底怎么算出来的? 曝光量是由光圈和快门共同决定的。曝光量增加一倍,就叫做曝光增加一档。当光圈一定时,曝光量和快门时间(也就是曝光时间)成正比,例如1/30秒就比1/60秒曝光增加一倍,也就是增加一档。这比较容易理解。比较容易迷惑的是光圈。 光圈一般用F数(F number或者F/#)来表示,其定义为:
f/#=fD
其中f是镜头焦距,D是镜头入射孔径。如果拿起一个镜头,从前面看进去,所看到的那个圆形小孔的直径,就是镜头的入射孔径了。对于一般相机镜头,这个孔径大小是可调的,由f/#的设置来控制。有些人可能会想,既然计算曝光量,为什么不直接拿孔径大小D来算,还要定义一个什么f/#。这是因为,感光器件(胶片或者CCD)的曝光量不仅和孔径大小有关,还和焦距有关。用f/#能更准确的表示曝光量。但是这有一个前提,就是物体离镜头比较远,如果物体离镜头很近(例如显微镜),就不能用f/#来算曝光量了。这时候一个更常用的量是数值孔径(numerical aperture或NA)。 因为孔径D在分母上,所以f/#数值越小,光圈越大。例如光圈f/2比f/4要大。但是f/2并非比f/4大一档光圈,而是二档。因为镜头通光量和孔径面积成正比,也就是和孔径大小的平方成正比。所以,比f/4大一档的光圈是
422.8
实际上还会经常碰到分数表示,例如半档,1/3档。对于普遍情况下,可以用下面的公式计算两个光圈究竟差几档:
N=2log2f/#2f/#1
例如,f/1.4和f/1.8相差
N=2log2f/1.8f/1.423

2008年10月29日星期三

光束质量因子M2(M squared)的测量

各种文献经常会用M2(M squared)因子来评价光束的质量。到底什么是M2?一般文献会告诉你,M2就是一个光束的腰半径和发散角的乘积跟TEM00高斯光束相比的比值。M2≥1,因为TEM00高斯光束的该乘积具有最小值。要想从实验得到M2的值,不可避免的要涉及光束半径测量的问题。
  1. 光束半径
  2. 光束没有明显的边界,因此它的半径有很多不同定义方法。对于高斯光束,最常见的定义就是1/e2半径,也就是把光强下降到最大值的1/e2的位置定义为半径,通常在公式里以W表示。在统计学里,我们对高斯分布的宽度(半径)使用的是方差,也就是说,对于高斯分布函数
    f(x)=ae-x22σ2
    它的方差(二次矩)半径为σ。把这个公式和一维高斯光束光强公式
    I(x)=e-2x2wx2
    比较,就会发现W=2σ。无论是W还是σ,实验上都没办法直接测量。但是如下定义的宽度实验上是可以测量的:用一个刀片,横向扫描过光束,这样一部分光束被刀片遮挡,另外一部分会通过。如果通过的光强等于总光强的90%时刀片坐标为x1,通过的光强等于总光强的10%时刀片坐标为x2,这样光束的宽度可以用
    D=|x2-x1|
    表示。当然,这个比例不局限于10%和90%,也可能是其他值。这种实验方法称为“刀锋(knife edge)法”。这样的话,我们需要找出一个D和W(或者σ)的关系。可惜,这个关系依赖于光束的光强分布,所以不存在一种普遍适用的关系。但是对于TEM00高斯光束,这个关系不难得到。
  3. TEM00高斯光束
  4. 因为刀片在一维方向移动,所以我们只要对光强进行一维积分就可以了。高斯函数的积分为误差函数。例如我们计算宽度D内通过的光强占总光强的比例:
    -D2D2e-2x2w2dx-e-2x2w2dx=erf(2D2w)
    按照上面的例子,这个比值应该是80%。通过查表或者数值计算,我们可以得到
    D=1.2816w=2.5631σ
    这是TEM00高斯光束的结果。对于其他分布种类的光束,这个结果会有变化。
  5. M2因子
  6. 对于TEM00高斯光束来讲,光束半径在光轴方向(z方向)的变化可以表示为
    w2(z)=w02+(λπw0)2(z-z0)2
    其中z0表示TEM00高斯模式腰的位置。对于一般光束,我们已经提到过,光束发散程度一定超过TEM00高斯光束,所以可以引入一个M2因子,这样一般光束半径可以表示为
    w2(z)=w02+M4×(λπw0)2(z-z0)2
    上述各式均是在某单一横向方向(例如x),对于一般光束,x和y方向可能有不同的半径和M2(例如半导体激光),甚至各个方向都不相同,这时候就需要更多方向上的测量才能确定光束分布。M2可以作为光束质量的一个量度。M2越接近1,光束质量越好,发散越小,聚焦时形成的斑点越小。
  7. 刀锋法测量
  8. 上面的例子中,我们用10%和90%作为光束宽度的测量标准,那么可不可以用其他数值呢?另外,上面得到的D和W之间的关系只对于TEM00高斯光束适用,那么一般的光束半径如何测量呢?Siegman的一篇论文阐述了这个问题,结论是对于绝大多数激光光束,如果阈值选择在8.5%到11.6%之间,TEM00高斯光束的结果都可以作为很好的近似,10%无疑是一个很好的折衷。其实对于大多数激光光束而言,TEM00都是主要成分,这样的近似在大多数时候都是没什么问题的。 测量时,可以在不同的位置z多测几组,然后进行拟合,得到光束的M2和其他各个参数。

2007年11月13日星期二

计算折射率和其他光学变换的网站

计算折射率和其他光学变换的网站

http://www.luxpop.com/

2005年5月31日星期二