raw格式怎么打开图片(LibRaw中如何读取RAW格式的图像)
LibRaw 是一个用来处理 RAW (CRW/CR2, NEF, RAF, DNG, and others) 格式图片的 C++ 库,支持各种操作系统。下面演示下如何读取raw格式的照片,这里以小米11Ultra来演示。
打开小米相机,选择专业模式,选择右上角的三条杆,选择RAW,这样小米手机就能输出dng格式的RAW文件了。

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui_c.h>
#include "libraw.h"
#define OUT RawProcessor.imgdata.params
#define OUTR RawProcessor.imgdata.rawparams
#define P1 RawProcessor.imgdata.idata
#define S RawProcessor.imgdata.sizes
#define C RawProcessor.imgdata.color
int main(int argc, char* argv[])
{
printf("Processing file %s\n", argv[arg]);
ret = RawProcessor.open_file(argv[arg]);
if (ret != LIBRAW_SUCCESS)
{
fprintf(stderr, "Cannot open %s: %s\n", argv[arg],
libraw_strerror(ret));
continue; // no recycle b/c open_file will recycle itself
}
printf("相机模式:%s, 厂商:%s.\n", P1.model, P1.make);
printf("拜尔模式: ");
putchar(P1.cdesc[RawProcessor.fcol(0, 0)]);
putchar(P1.cdesc[RawProcessor.fcol(0, 1)]);
putchar(P1.cdesc[RawProcessor.fcol(1, 0)]);
putchar(P1.cdesc[RawProcessor.fcol(1, 1)]);
putchar('\n');
std::cout << "ibraw_iparams_t----->" << P1.cdesc << std::endl; //libraw_iparams_t结构体,也就是宏定义P1, 这里P1.cdesc只是告诉用户是GMCY还是RGBG
//给后面程序判断用
char cdesc[5] = {0};
cdesc[0] = P1.cdesc[RawProcessor.fcol(0, 0)];
cdesc[1] = P1.cdesc[RawProcessor.fcol(0, 1)];
cdesc[2] = P1.cdesc[RawProcessor.fcol(1, 0)];
cdesc[3] = P1.cdesc[RawProcessor.fcol(1, 1)];
RawProcessor.raw2image();
for (int i = 0; i < RawProcessor.imgdata.sizes.iwidth * RawProcessor.imgdata.sizes.iheight; i++)
{
if (i == 10)
{
break;
}
printf("i=%d R=%d G=%d B=%d G=%d\n",
i,
RawProcessor.imgdata.image[i][0],
RawProcessor.imgdata.image[i][1],
RawProcessor.imgdata.image[i][2],
RawProcessor.imgdata.image[i][3]
);
}
}
再使用RawProcessor.raw2image();之后就可以读取RAW格式的RGB格式了。我本地windows上输出结果为

打印小米的拜耳模式

打印每个像素点的值
这里说说拜耳这个天才的人物

2012年末,一位对世界,产生巨大影响的老人,进入了天堂,他的名字叫布莱斯·拜尔(Bryce Bayer)。
拜尔在天堂遇见了上帝。
上帝:拜尔,你这个骗子!看看你在下面做的好事,现在还有脸来见我?
拜尔:我的主啊,我是您忠实的信徒,我怎么会是骗子呢?
上帝:你在下面发明了个什么“拜尔阵列”,这玩意儿几乎垄断了人类的数码相机行业,这是你干的吗?!
拜尔:是啊,我的主。我发明了这种传感器,让数码摄影技术在人类中得到了普及,这难道不是干了个大好事吗?
上帝:普及数码摄影技术当然是好事,但关键是,你的传感器偷工减料啊!我在创世纪的时候,说要有光,于是就有了光,我创造的光里面包含了红、绿、蓝三种基本色。
但是你的传感器里面根本就没有完整记录我这三种颜色,你每个像素只记下了一种颜色的亮度值,然后通过后期处理(=PS?)软件,胡乱猜出像素里另两个基本色,再弄出图像来糊弄人,一张照片里只有1/3的色彩是真实的,这还不算骗子啊你!
拜尔:我的主啊,您看我一脸老实相,会是骗子吗!我的传感器这么干,是有苦衷的啊!您得听我慢慢道来。
上帝:好,那你说吧。要是说得有道理,能说服我,特别是能说服蜂鸟网上的网友,那才能让你进入名人堂。否则的话,你还得回到人间去,自己去收拾你的烂摊子。
拜尔手臂一挥,上帝面前出现了一个大屏幕,结合着屏幕上的图文,拜尔开上给上帝解释起来。
拜尔:那是上个世纪的70年代,我在柯达公司从事科研工作,其中一个重要课题,就是怎么样才能将影像转换成数字信号储存下来。我们都是凡人啊,凡人没有您那样无边法力,所以我们的光电传感器只能够记录光的强度,而无法分辨光的颜色,即使是现在21世纪了,依然是这样。

但是凡人也是贪心的,我们不满足于只能拍黑白数码照片,只能在有限的条件下想尽办法,去尽可能的获得色彩。我绞尽了脑汁,要想办法解决颜色的记录问题,直到有一天我的小狗菲儿帮我解决了这个问题。
上帝:你的狗?
拜尔:是的,我的小狗狗菲儿。这天它嘴里咬着一件东西,跑到我面前,是一个黄色滤镜。就是我以前拍黑白照片时常用的那种滤镜,黄色的滤镜可以滤除或减小红、蓝光对照片的影响。
看到这个滤镜,我脑中顿时灵光一闪,如果我在每个像素上分别装上这三种滤镜,不就能得到三种光的亮度了吗,然后一合成,色彩就重现了!上帝啊,难道不是您指示我的小狗来帮助我的吗?

上帝:咳咳,嗯,这倒是我干的……
拜尔:但是,我们凡人做不到。我们的元器件制造水平达不到这个要求。我们无法轻易地在一个像素里造进去三个滤镜和感光元件。即使勉强能做到,这个成本也不是绝大多数人能够承受的。无法商业化的东西,对于我们商业化的公司而言,没有现实价值。
在随后的日子里,我又尝试了各种方法,最后,发明了一种基于单个颜色微小滤镜的影像传感器系统,就是现在被人们称为“拜尔阵列”的传感器系统。

这只用一块图像传感器,就解决了颜色的识别。做法是在图像传感器前面,设置一个滤光层(Color filter array),上面布满了一个个滤光点,与下层的像素一一对应。
每个滤光点只能通过红、绿、蓝之中的一种颜色,这意味着在它下层的像素点只可能有三种颜色:红、绿、蓝,或者什么也没有(黑)。
不同颜色的滤光点的排列是有规律的:每个绿点的四周,分布着2个红点、2个蓝点、4个绿点。这意味着,整体上,绿点的数量是其他两种颜色点的两倍。这是因为研究显示人眼对绿色最敏感,所以滤光层的绿点最多。

每个摄影者在完成光圈、快门、对焦设置等前期工作后,按下快门,于是光线经过镜头,被传感器上的为滤镜分解成一个个单色的光,由传感器记录下每个点的光强度数值,这就得到了RAW数据。
把RAW的灰度值转换成图像,是这样的:

有人会对这样的照片感到满意吗?显然人心是不满足的!于是后期工作开始了,后期就由计算机软件来进行处理,可以是全自动(相机直出),也可以是人工参与(操纵后期软件)。
上帝:慢着慢着,难道不经过后期处理的RAW,就只有这样的黑白马赛克吗?
拜尔:是的您那,没有计算机系统的后期处理,您最多就只能看到这个黑白马赛克,没有完整的图像!
如果我们对它微处理一下,把每个像素对应点的颜色加上后,也可以是这样的:

计算机进行后期处理的第一步就是猜色,也叫去马赛克。
如果一个像素只可能有三种颜色,那么怎么能拍出彩色照片呢?前面说了,每个滤光点周围有“规律”地分布其他颜色的滤光点,那么就有可能结合它们的值,判断出光线本来的颜色。以黄光为例,它由红光和绿光混合而成,那么通过滤光层以后,红点和绿点下面的像素都会有值,但是蓝点下面的像素没有值,因此看一个像素周围的颜色分布----有红色和绿色,但是没有蓝色----就可以推测出来这个像素点的本来颜色应该是黄色。


在得到每个像素的RGB颜色后,后期软件还要加入白平衡矫正、gamma校正,并应用风格曲线、降噪锐化设置等参数,这些参数多数可以人为去设定,这个参数设定的过程,就是俗称的ps,准确地讲就是人工地后期处理。
处理完后最后生成一幅位图,可以用TIFF、JPG等位图格式保存在磁盘上。
上帝:不对,不对!你说是要完成后期处理后才能看到图像,但是多数相机都有实时取景模式,我都没拍呢,哪来的后期!还有我看到我们天国摄协里也在玩LR什么的,这不是在做后期调整前就看到图了?还是看着图一点一点地调呢!这你怎么解释?
拜尔:我的主啊,人类是很狡猾的!实时取景和LR等软件里给先你看到的图像,都是先用它内部默认的后期参数进行粗略后处理,先糊弄一下人眼,满足一下心理。当你全部后期参数设置完后,这不还有一个“导出”的过程吗?这才是真正在进行完整全面的图像后处理呢!
上帝:我的上帝啊!哦,也就是我的我啊!弄出个照片还有这么多花花肠子!
拜尔:在您还未赐予我们人类全色彩的感光器件前,我也是没办法才想出这么个主意,通过计算去猜测颜色的啊!
上帝:那后来不是有个适马公司搞出个叫FOVEON X3的全色彩图像传感器吗?有了这个怎么还在用你的老拜尔?
拜尔:我的主啊,FOVEON X3的全色彩传感器是好,但是一来有专利权的限制,难以推广,二来也是由于技术水平限制,这个FOVEON X3传感器在高感光度下的表现实在是不行,所以多数厂家还是在沿用我的老拜尔阵列。
哦,还有一家富士公司,改进了我拜尔阵列的颜色滤镜的排列方式,也取得了很好的效果。据说佳能公司也有了全色彩的传感器专利。不知道今后那天,我的老拜尔阵列也会和我一起进入天堂,存入天堂博物馆了。

可以看到小米11Ultra的RAW格式的拜尔模式: GBRG
所以后续的整个计算转换都是基于这个模式来的。其次可以看到第一行的输出
i=0 R=0 G=0 B=0 G=501
i=1 R=0 G=0 B=388 G=0
i=2 R=0 G=0 B=0 G=500
i=3 R=0 G=0 B=403 G=0
i=4 R=0 G=0 B=0 G=505
i=5 R=0 G=0 B=407 G=0
i=6 R=0 G=0 B=0 G=504
i=7 R=0 G=0 B=407 G=0
i=8 R=0 G=0 B=0 G=495
i=9 R=0 G=0 B=412 G=0
第一行是GBGBGBGBGB的排列,注意:这里打印出的像素点的值大于255,是因为默认小米存储的颜色值是16位的,而不是8位的。
喜欢养花的朋友对园艺蛭石相对比较熟悉,所谓园艺蛭石就是用于园林、园艺等方面的膨胀蛭石。它是一种在高温下会膨胀的矿物,因受热膨胀呈挠曲状,形态酷似水蛭而称为蛭石。园艺蛭石具有疏松土壤,透气性好,吸水性强的特点,很多人在养花、园艺过程中都会选择一些蛭石作为调节剂混合盆栽土壤,还用于无土栽培。蛭石作为种植
普洱茶是由云南普洱茶区的云南大叶籽晒毛茶制成的。经过发酵后,普洱茶属于红茶,生普洱茶属于绿茶。普洱茶含有蛋白质、维生素和矿物质,以及咖啡因、茶碱、膳食纤维等。普洱茶一周瘦10斤,能够减掉油脂的功效,甚至有人认为多喝普洱茶可以刮掉身体上多余的油。这是真的吗? 普洱茶成分 我们中华民族有五千多年的辉煌
《赠花卿》(唐)杜甫锦城丝管日纷纷,半入江风半入云。此曲只应天上有,人间能得几回闻。【注释】花卿:花敬定,唐朝武将,是成都尹崔光远的部将。上元二年(761年)五月十六,花敬定 平定梓州刺史段子璋叛乱,斩杀段子璋。但敬定居功自傲,骄恣不法,纵兵大掠,甚至断妇人手腕,以掠取金钏。后在追歼叛军残部时反被叛
杜兰特单打时经常会利用垫步调动防守重心左移,然后往右突破!或者垫步跳投,直接干拔三分垫步究竟有何魅力,让杜兰特如此频繁使用?今天就来教你怎么使用“垫”步!当然,网络上更多人把这个动作叫作“拖拽步”!杜兰特非常喜欢使用垫步,垫步作为运球过渡动作,除了各种对防守者的作用外,另外一个重要的点在于利用它调整