使用OpenCV打开RAW文件

首先来介绍一下关于相机的基础知识:
1.CCD/CMOS相机的感光元件对波长(即颜色)不敏感,如果拿一个裸体的CCD/CMOS传感器去拍摄图像,只能得到灰度图;
2.因为上述这条,人们必须找到能够将波长区分开的方法,其中一种是使用三个滤光片(通常是RGB三色),在这三个滤光片之后放置三个CCD,这就是3CCD相机;
0.jpg 3.显然上一种方法的成本太高了,聪明的人类又想到了另一个方法:那就是在CCD/CMOS传感器矩阵之前放置一个滤色片矩阵,每个像素对应一个滤色片,将RGB三种颜色的滤色片均匀分布在这个矩阵中,拍摄到图像后将对应颜色的像素的值取出来并进行插值,就得到了三个通道的数据。
1.jpg RAW文件存储的就是第三种方法拍摄的原始数据,可以使用photoshop打开,放大后能够很明显的观察到类似棋盘格一样的像素值。虽然没有白平衡设置,但最大的好处是真实的数据也没有被改变,基于这些数据操作者可以设置自己的通道权值,能够任意的调整色温和白平衡。
2.jpg
 

3.png

4.png 将图像放大:
5.png
局部放大
 

继续放大:
6.png
在一个项目中我用到了12bit的工业相机,通过调用该相机SDK中的函数可以将拍摄的图像数据保存为16bit单通道的raw文件,其中前12bit有效,末尾4bit是0。

下面来介绍如何用OpenCV打开raw文件。思路如下:
1.以二进制方式打开文件;
2.将每个像素对应的16bit的数据分成两个8bit,分别放入两个矩阵中;
3.对这两个矩阵进行色彩空间变换,转换为两个8bit三通道的图像;
4.将这两个图像合成为一个16bit三通道的图像。

废话少说,代码如下:
void CMy20120510readrawfileDlg::OnBnClickedButton2()
{
const int WIDTH = 1360;
const int HEIGHT = 1024;

CFile file;
file.Open(_T("aaa.raw"), CFile::modeRead | CFile::typeBinary);
file.SeekToBegin();

BYTE * pfilebuf = new BYTE[HEIGHT*WIDTH*2];

if (HEIGHT*WIDTH*2 != file.Read(pfilebuf, HEIGHT*WIDTH*2))
{
//提示文件读取错误
file.Close();
return;
}

file.Close();

//

CvMat* mat_a = cvCreateMat(1, HEIGHT*WIDTH, CV_8U); //单行矩阵便于赋值操作
CvMat* mat_b = cvCreateMat(1, HEIGHT*WIDTH, CV_8U); //同上

int i=0;

do {
CV_MAT_ELEM(*mat_a, unsigned char, 0, i) = pfilebuf[i*2]; //低8位信息
CV_MAT_ELEM(*mat_b, unsigned char, 0, i) = pfilebuf[i*2+1]; //高8位信息

i++;
}while(i<HEIGHT*WIDTH);

delete[] pfilebuf;

cvReshape(mat_a, mat_a, 0, HEIGHT); //把单行矩阵整形为二维矩阵
cvReshape(mat_b, mat_b, 0, HEIGHT);

IplImage* img_a = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_8U, 3);
IplImage* img_b = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_8U, 3);

cvCvtColor(mat_a, img_a, CV_BayerBG2RGB); //色彩空间转换,即Bayer模式转为RGB
cvCvtColor(mat_b, img_b, CV_BayerBG2RGB);

cvReleaseMat(&mat_a);
cvReleaseMat(&mat_b);

cvNamedWindow("img_a");
cvNamedWindow("img_b");
cvShowImage("img_a", img_a);
cvShowImage("img_b", img_b);

//

//因为cvAddWeighted需要参数矩阵都具有相同类型、相同大小
IplImage* img_a_16 = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_16U, 3);
IplImage* img_b_16 = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_16U, 3);

cvConvert(img_a, img_a_16);
cvConvert(img_b, img_b_16);

IplImage* img = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_16U, 3);

//高8位左移8位加上低8位合成一个16位图像
cvAddWeighted(img_a_16, 1, img_b_16, 256, 0, img);

cvNamedWindow("img");
cvShowImage("img", img);

cvWaitKey();
cvDestroyAllWindows();

cvReleaseImage(&img_a);
cvReleaseImage(&img_b);
cvReleaseImage(&img);
}

得到的图像如下:
7.png

可以看出img_a的结果是原16bit图像的低8位,直接显示的话是没什么意义的。
最后合成的16bit肉眼几乎观察不出有什么区别,但是对OpenCV来说已经是可以直接处理的16bit图像数据了!

接下来,要怎么处理就可以自由发挥啦。

顺便给出OpenCV帮助文档里cvCvtColor对Bayer模式转换的说明,请认真阅读哦:

8.png

 

 
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=18681&p=60197&hilit=%E5%8D%95%E5%BA%94%E7%9F%A9%E9%98%B5#p60197
### 回答1: MHD文件RAW文件都是常见的用于存储医学图像数据的文件格式。下面是它们如何被打开的解释: MHD(MetaImage Header)文件是一种元数据文件,通常与RAW文件一起使用,用于描述和存储医学图像的基本信息和元数据。MHD文件是一个文本文件,包含图像的维度、像素值的数据类型、像素间距和文件名等信息。要打开MHD文件,我们可以使用文本编辑器打开文件,查看其中的元数据。 RAW文件是一种包含像素值的二进制图像文件,它通常存储了由医学成像设备生成的原始图像数据。这些文件不包含头部信息,因此需要配合MHD文件使用以获取图像的相关信息。要打开RAW文件,我们可以使用图像处理软件或编程语言中的相应库来读取二进制数据,并使用MHD文件中的元数据来解释和处理图像。 总结来说,如果我们只想查看图像的相关信息,可以打开MHD文件,并使用文本编辑器查看其内容。如果我们想访问和处理图像的原始像素值数据,我们需要首先打开MHD文件以获取图像的元数据,然后使用相应的软件或编程语言读取相关的RAW文件,并使用元数据解释和处理图像数据。 ### 回答2: MHD和RAW是两种常见的文件格式,用于存储医学图像或其他科学数据。MHD文件是MetaImage文件的简写,它是一个文本文件,用于存储图像的元数据信息以及指向原始数据文件的链接。而RAW文件则是原始数据文件,包含未经过处理的图像或科学数据的原始二进制数据。 要打开MHD文件,我们可以使用不同的软件。其中一种流行的软件是SimpleITK,它是一个用于处理医学图像的强大的开源库。我们可以使用SimpleITK库中的ReadImage函数来读取MHD文件读取后,我们可以通过获取其像素数组来访问图像的数据。 另一方面,要打开RAW文件,我们可以使用一些图像处理软件,如ImageJ或Fiji。在这些软件中,我们可以导入RAW文件并指定图像的大小、尺寸和数据类型。然后,我们可以将原始数据解析为图像,并使用相应的图像处理功能进行分析或视觉化。 需要注意的是,在打开MHD或RAW文件之前,我们需要有相应的软件或库来处理这些文件。因此,如果我们打算使用这些文件,我们需要先安装适当的软件,并了解如何使用它们来打开和处理这些特定文件格式。 ### 回答3: MHD (MetaImage Header) 文件RAW (Raw Image Data) 文件是用于存储医学图像的两种常见格式。 MHD 文件是一种元数据文件格式,用于描述和存储医学图像的信息。它通常包含图像的大小、像素类型、空间方向、像素间距等信息。MHD 文件本身并不存储原始图像数据,而是通过引用外部 RAW 文件来访问。 RAW 文件存储了医学图像的原始像素数据,它不包含任何元数据。通过组织像素数据的方式来呈现图像,RAW 文件没有进行任何图像处理或压缩。由于没有元数据的附加开销,RAW 文件通常比其他格式更小。 要打开 MHD 文件,通常需要一个支持该格式的特定软件或工具。这些软件可以读取 MHD 文件中的元数据,并使用其中的信息来加载和解析关联的 RAW 文件。一旦打开 MHD 文件,图像软件可以使用 RAW 文件中的原始数据进行图像处理、分析和显示。 要打开 RAW 文件,可以使用一些专门的图像处理软件或医学影像软件。这些软件通常支持多种图像格式,并具有加载和解析 RAW 文件的能力。打开 RAW 文件后,可以对图像进行处理、调整、测量或进行其他分析操作。 总之,MHD 和 RAW 文件是一对常见的医学图像文件格式。MHD 文件存储元数据信息,而 RAW 文件则存储原始像素数据。要打开这些文件,需要使用支持这些格式的特定软件或工具。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值