用MATLAB进行图像处理

图像处理概念,算法和MATLAB

阅读相机原始文件到MATLAB的技巧

一位学术同事最近问我如何读取传感器数据(在拜耳从尼康原始相机文件(NEF文件)到MATLAB。我们想出了一个办法,我想我应该把它传下去。

不过,我应该提醒您,这涉及多个步骤,其中一些是“高级操作”。

首先,我建议我们尝试使用免费的adobedng转换器程序将NEF文件转换为DNG(数字负片)文件。经过反复试验,我们发现有必要告诉DNG Converter进行“未压缩”转换。以下是相关对话的截图。

实际上,DNG文件是一种非常特殊的TIFF文件。然而,我们无法读取原始传感器数据imread.如果你打电话imread在DNG文件中,它只会返回缩略图。相反,我们必须利用MATLABTiff.该类提供了对TIFF文件“内容”的低级访问。要成功地使用它,熟悉TIFF文件的工作方式会有所帮助。

但首先让我们看一下使用的示例DNG文件imfinfo

信息= imfinfo(“books.dng”
信息=文件名:'\\mathworks\home\eddins\files\I\ipblog_material\2011\books。dng' FileModDate: '08- 03 -2011 12:01:20' FileSize: 25079002格式:'tif' FormatVersion:[]宽度:256高度:170 BitDepth: 24 ColorType: ' truecololformatsignature: [73 73 42 0] ByteOrder: '小-endian' NewSubFileType: 1 BitsPerSample: [8 8 8 8] Compression: 'Uncompressed' PhotometricInterpretation: 'RGB' StripOffsets: 133234 SamplesPerPixel: 3 RowsPerStrip: 170 StripByteCounts: ' 130560 XResolution: [] YResolution: [] ResolutionUnit: 'None' Colormap: [] PlanarConfiguration: []'Chunky' TileWidth: [] TileLength: [] tileoffset: [] TileByteCounts: [] Orientation: 1 FillOrder: 1 GrayResponseUnit: 0.0100 MaxSampleValue: [255 255 255] MinSampleValue: 0 Thresholding: 1 Offset: 8 Make: 'NIKON CORPORATION ' Model: 'NIKON D90 ' Software: 'Ver.1.00 ' DateTime: '2011:03:06 14:45:58 ' SubIFDs: {2x1 cell} XMP: [1x7309 char] DigitalCamera: [1x1 struct] DNGVersion: [4x1 double] DNGBackwardVersion: [4x1 double] UniqueCameraModel: 'NIKON D90 ' ColorMatrix1: [9x1 double] ColorMatrix2:[9x1 double] AnalogBalance: [3x1 double] AsShotNeutral: [3x1 double] BaselineExposure: 0.2500 BaselineNoise: 1 baselinesharness: 1 LinearResponseUnit: 1 CameraSerialNumber: '3276464 ' LensInfo: [4x1 double] ShadowScale: 1 DNGPrivateData: [121588x1 double] CalibrationIlluminant1: 17 CalibrationIlluminant2: 21 AliasLayerMetadata: [16x1 double] OriginalRawFileName: 'books。NEF ' UnknownTags: [15x1 struct]

你们可以看到imfinfo认为这个文件是一张256 * 170的真彩色图像。但正如我上面提到的,这只是一个缩略图。我们想要的数据隐藏在一个叫做“SubIFD”的东西中。

信息。SubIFDs {1}
ans =文件名:` \\mathworks\home\eddins\files\I\ipblog_material\2011\books。dng' FileModDate: '08- 03 -2011 12:01:20' FileSize: 25079002格式:'tif' FormatVersion: [] Width: 4310 Height: 2868 BitDepth: 16 ColorType: 'CFA' FormatSignature: [73 73 42 0] ByteOrder: ' bit -endian' NewSubFileType: 0 BitsPerSample: 16 Compression: 'Uncompressed' PhotometricInterpretation: 'CFA' StripOffsets: 356842 SamplesPerPixel: 1 RowsPerStrip: 2868 StripByteCounts: 24722160 XResolution: [] YResolution: [] ResolutionUnit: 'None' Colormap: [] PlanarConfiguration: 'Chunky' TileWidth:[] TileLength: [] tileoffset: [] TileByteCounts: [] Orientation: 1 FillOrder: 1 GrayResponseUnit: 0.0100 MaxSampleValue: 65535 MinSampleValue: 0 threshold: 1 Offset: 130252 CFAPlaneColor: [3x1 double] CFALayout: 1 LinearizationTable: [772x1 double] BlackLevelRepeatDim: [2x1 double] BlackLevel: 0 WhiteLevel: 3767 DefaultScale: [2x1 double] DefaultCropOrigin: [2x1 double] DefaultCropSize: [2x1 double] BayerGreenSplit: 0 AntiAliasStrength: 1 BestQualityScale: 1 ActiveArea:[4x1 double] UnknownTags: [2x1 struct]

这是好东西!它是一个每样本16位的4310 × 2868彩色滤波器阵列(CFA)。下面是如何阅读的。我只给出这些步骤,不做解释,请大家参考文档Tiff获取更多信息。

警告MATLAB: tifflib: TIFFReadDirectory: libraryWarningt = Tiff(“books.dng”“r”);offset = getTag(t,“SubIFD”);setSubDirectory (t,抵消(1));Cfa = read(t);关闭(t);

这是一个屏幕截图imtool在400%放大倍数下显示结果的彩色滤镜阵列。您可以清楚地看到拜耳阵列模式。

我们想知道为什么最大传感器值是768。经过一些调查,我们发现尼康似乎存储了一个非线性量化的原始12位值。线性化曲线可以在DNG文件中找到:

curve = info.SubIFDs{1}.LinearizationTable;情节(曲线)

所以如果你要基于这些原始数据进行计算,你可能想要先用这条曲线将它线性化回到原始的12位范围。

你们用过MATLAB吗Tiff类做高级机动与TIFF文件?在这里发表评论,让我们知道你做了什么。




使用MATLAB®7.11发布

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。