利用 MATLAB 和 Dcraw 處理數碼相機 Raw 文件的完整流程

本文爲轉載,原博客地址:http://capbone.com/process-raw-data-using-matlab-and-dcraw/

這篇文章要說的當然不是如何用 PS、LightRoom 來處理 Raw 文件,而是一種更加徹底、數據化的辦法 -- 利用 MATLAB 直接處理數碼相機的 CFA(Color Filter Array) 數據。

接觸過攝影的人都知道,對於數碼相機來說 Raw Data 是原始的、未被處理的數據,相比 JPEG,Raw 文件記錄了更多的場景信息,保留了更寬廣的色域以及動態範圍,也留下了更爲自由的後期處理空間。Raw Data 只是一種圖像數據的封裝形式而並不是一種文件格式,不同廠商的相機一般都擁有自己的 Raw Data 格式,比如常見的 *.CR2、*.NEF、*.ARW、*.ORF(Olympus)、*.RAF(Fuji)、*.DNG(Adobe、Leica)等。

對於大部分人來說,處理 Raw Data 的軟件不外乎就那麼幾種,Camera Raw、LightRoom、Aperture、DxO 以及各廠商自帶的處理軟件。這些軟件雖然通過圖形界面提供了簡潔易懂的處理流程,但是遺憾的是它們能導出的都並非真正意義上的 “Raw Data”,即傳感器直接記錄的、與照度成線性關係的第一手數據。對於攝影、媒體、藝術領域,這些軟件已經足夠強大,但是在圖像處理、計算機視覺等研究領域,我們需要的是把照片中的信息轉換爲能夠通過數字來定量表示的形式,或者通過一些公式、算法直接對圖像(或圖像的某一部分)進行處理,再或者對兩張圖片之間的差別進行量化表示,這時候 LightRoom 這些軟件就顯得有些無能爲力了。

這篇文章要講的就是如何通過 MATLAB 對 Raw Data 進行處理並從中提取出我們想要的圖像信息,這是一種我所瞭解的最徹底、最根本的獲取相機傳感器原始信息的方法,並且這些信息都是以數字的形式記錄下來,可以很方便地在此基礎上進行圖像的存儲、傳輸或者進一步操作。實際上 MATLAB 本身就提供了非常強大的圖像處理功能,正所謂 “普通青年處理圖片用 PS,文藝青年處理圖片用 LightRoom,2B 青年處理圖片用 MATLAB ”。

由於各家相機廠商對 Raw Data 採取了不同的封裝方式,MATLAB 並不能一一識別這些文件格式,因此我們需要先利用 Dcraw 將不同擴展名的文件轉換爲 MATLAB 能夠讀取的圖片格式 -- tiff。Dcraw 是一種 Raw Data 解析方案,它能夠識別市面上大部分的相機型號,並將相應的 Raw 文件導出爲 tiff 或 PGM/PPM/PAM 格式文件。事實上 Dcraw 本身就可以算作一種 Raw Data 的處理程序,它擁有白平衡設置、伽馬校正、色彩空間轉換、去馬賽克、亮度調節等一系列功能,並且提供了 C 源代碼,讓用戶可以在任何操作系統上對其進行編譯。關於 Dcraw 更詳細的設置可以在其官方文檔或這個博客中查看,這裏我們僅僅把它作爲 Raw Data 到 tiff 的一種媒介,而不對圖像做任何的處理 -- 把所有的操作都留到 MATLAB 裏。

目錄

0. Dcraw 的預處理

以下操作以 Windows 平臺爲例,使用的相機爲 Nikon D3X。爲了簡化流程,我們使用 Dcraw 現成的可執行文件(http://www.centrostudiprogressofotografico.it/en/dcraw/)而不在本地對其編譯。一般將這個 Dcraw.exe 文件放在 C:\windows 路徑下,這樣可以直接從運行(Win + R)中執行。在運行中輸入 cmd 進入命令行窗口,這時已經可以直接調用 Dcraw,或者輸入 dcraw 查看相關的一些命令。

由於我們不準備用 Dcraw 對 Raw Data 做任何處理,只需要輸入

dcraw -4 -T -D -v pathfilename

其中 pathfilename 爲圖像的絕對路徑,比如 E:\photosimg1.NEF 這樣。這裏的 -T 表示將圖像以 tiff 格式導出,-D 表示不對圖像做任何的彩色插值和亮度調節(彩色插值的問題後面會提到),-v 表示在 Dcraw 處理結束後在屏幕上顯示相關信息(這一步有沒有都無所謂),而 -4 等價於 -6 -W -g 1 1,即表示導出的圖像爲16位(而不是常見的 JPEG 的8位 )、不進行任何白平衡校正不進行任何伽馬校正。在一些需要獲取拍照時白平衡設置的場合也可以使用 -6 -w -g 1 1 -T -D 這樣的參數組合,但這裏我們使用 -4 -T -D 就好。各參數的意義在上面提到的官方文檔頁面中有詳細的說明。

完成這一步之後在原 Raw 文件同一個文件夾下就會多出了一幅 tiff 格式的圖像,這時候大部分圖片瀏覽軟件都可以打開它了(一些看圖軟件在安裝插件後能夠直接瀏覽 Raw 文件,比如我的 IrfanView,但實際上它們打開的只是嵌入在 Raw Data 中的經過一系列轉碼的縮略圖而並非 Raw 本身)。但是爲了避免各種圖像瀏覽軟件不同的解碼方式對預覽圖像造成的影響,下面都使用 MATLAB 中的 imshow 函數來瀏覽圖像。

同樣是這幅 tiff 圖片,如果直接使用 IrfanView 查看,得到的是下面的效果,明顯比 MATLAB 中的要亮得多。

下面的圖片截圖如果不特殊說明都是指在 MATLAB 中預覽的效果。得到的這幅 tiff 圖像除了一些縮略圖和文件頭之外,基本上記錄了與 Raw Data 同樣多的圖像信息,並且是 MATLAB 可讀取的。由於編碼上的差異,並且 Dcraw 不像大多數軟件那樣去除了圖像邊緣的一些像素,有時這個 tiff 文件的體積甚至會比 Raw Data 文件更大。與 Camera Raw、LightRoom 等軟件打開的 Raw 文件最明顯的區別就是,這張 tiff 圖片是黑白的。這裏牽涉到了去馬賽克(Demosaic,但我更喜歡叫它彩色插值)的問題,下面我簡單地談談我的理解,不一定完全正確。詳細的介紹還是看 Wiki 吧。

大家都知道一般民用的數碼相機只有一塊 CMOS 或 CCD(這裏不談 3CCD 或 Foveon X3),而無論是 CMOS 還是 CCD,都只對照射在它們有效面積之上的光通量敏感,並且產生與該光通量成正比的電流作爲輸出。這個輸出實際上是由光源的光譜功率分佈(SPD)、物體表面反射比以及相機傳感器靈敏度共同作用的關於波長的一個積分結果。由於這是一個對整個可見光波段的關於波長的積分,顯然不能夠表示任何色彩信息。正因爲這一點,目前消費級相機的傳感器都是不具備任何顏色感知能力的,照片中所有色彩的信息實際上都是軟件處理後的結果。正因爲這點,我們一般不可能得到一張真正“未經處理過”的彩色圖像。既然傳感器只能感受光的“強度”而非“色彩”,我們就需要在傳感器之前放置一些透過率滿足一定波長條件的濾光片,使得經過這些濾光片後作用在傳感器上的光信號只是某一波長範圍內的積分形式(比如500 ~ 600nm),而非整個可見光波段(380 ~ 780nm)。實現這個功能最常見的濾光片就是拜耳濾鏡,如下圖所示。

灰色部分爲 CMOS,彩色部分爲對應顏色的濾鏡,每個濾鏡下方對應的像素點只能接收到該濾鏡對應波長的光信號,而不是整個可見光譜範圍的光信號。根據左上角四個濾鏡從左至右、從上至下的順序一般有“RGGB”、“GBRG”、“GRBG”幾種。D3x 爲“RGGB”型,具體相機的濾鏡排列可以對着紅綠藍單色圖片分別拍攝一張然後查看 Raw Data 的數值分佈來獲得。知道自己相機所用的拜耳濾鏡的排列模式(Pattern)是進行彩色插值操作的前提(之所以綠色濾波片的數量是紅藍濾波片數量的兩倍,主要是因爲人眼對綠光最爲敏感,這點不作展開說明)。既然知道了每個顏色濾波片背後 CMOS 對於像素單元上的光強度,以及各個像素之上的濾波片顏色,我們就可以對每個像素的三原色進行恢復,這就是去馬賽克(Demosaic)或者說色彩插值的本質。舉個例子,假設某個 CMOS 陣列上的濾波片爲“RGGB”排列(參考上圖),現已知某個像素點 x 對於爲 R 濾波片,則其上、下、左、右四個像素點必定對於 G 濾波片,右上、左上、右下、左下四個像素點必定對於 B 濾波片,因此這時候像素點 x 對應的 R 通道數值就是該點 CMOS 上實際的電流大小;而 G 通道數值是對上、下、左、右四個像素 CMOS 電流大小取平均之後的值;同理,B 通道是對右上、左上、右下、左下四個像素取平均之後的值。當然這裏說的只是最簡單的插值方法 -- 領域取平均法,實際上各個廠商都需要考慮各方面因素對色彩插值進行算法上的優化。一般我們看到的 JPEG 圖像或者彩色的所謂的 Raw Data,都必定經過這一步色彩插值。

但是我們現在希望把這一步驟留到 MATLAB 中進行,所以在 Dcraw 中選用 -D 參數使得插值先不被執行,這也是爲什麼上面得到的 tiff 圖像僅僅是灰度圖像 -- 因爲它只記錄了光強度信息,而不包含任何顏色信息。

這時可以在 MATLAB 中打開這幅灰度圖像了。由於各個像素上記錄的光強度是一個標量,這幅圖像相當於一個 m × n 的矩陣,其中 m 和 n 分別爲 CMOS 縱向和橫向的像素數。

raw = double(imread('img1.tiff'));

現在終於可以開始在 MATLAB 中對相機傳感器的原始數據進行處理了。整個處理過程大概遵循以下步驟:

如果不是要對圖像進行處理,而僅僅是希望獲得拍照時場景照度的相關數據,只需要進行到第三部 Demosaicking 即可。下面的步驟僅僅是在 MATLAB 中模擬一張相片從被 CMOS 記錄到最終呈現在屏幕上的整個過程,相當於人爲地重新干了一遍數碼相機中圖像處理芯片乾的事情。若是出於研究的需要,可以對任意一步修改或增加操作。例如需要研究 Gamma 曲線,就不應該在 MATLAB 中執行我提供的 Gamma 校正(γ=2.2γ=2.2)的函數,而應該根據需要使用合適的 Gamma 曲線。

1. 線性處理(Linearization)

出於節省數據存儲空間的目的,一些廠商(例如尼康和索尼)的 Raw Data 並不完全與像素點上的照度呈線性關係,而是會在編碼上做一些處理,比如非線性壓縮等。不過這裏我們不需要擔心這個問題,因爲之前在 Dcraw 中使用 -4 參數時就已經解決了這個問題。我們只要確保各個像素的數值是分佈在 14-bit(雖然 Dcraw 中的 -4 參數將圖像設爲16位,但其最大值仍然爲 2141=16383214−1=16383)能夠儲存的範圍之間即可,一般爲 0 ~ 16383,並將超出這個區間的數值給拉回區間中。再將這些數值歸一化至 0~1 區間中。

black = 0;
saturation = 16383;
lin_bayer = (raw-black)/(saturation-black); % 歸一化至[0,1];
lin_bayer = max(0,min(lin_bayer,1)); % 確保沒有大於1或小於0的數據;

要說明的是,我這裏使用的 black = 0 以及 saturation = 16383 僅僅是針對 D3x 而言,不同廠家的相機,或者同一廠家不同型號的相機都可能不同。如果第一次使用某臺相機不知道這兩個參數,可以使用 dcraw -v -T 命令來查看,然後記下這兩個數值供日後使用。要注意的是在命令行中每執行一次 dcraw 的命令,所生成的 tiff 文件都會覆蓋掉原來的 tiff 文件,因此建議將原始的 Raw 文件先複製到另外一個路徑下在執行 dcraw -v -T 命令。

下圖中我使用的 Nikon D3x 和 SONY A7 就擁有完全不同的 black 和 saturation 值(索尼的 Raw 被壓縮到了坑爹的12位...),因此在 MATLAB 中處理 A7 的圖片時我就需要將上面的代碼改爲 black = 128 以及 saturation = 4095

線性處理到這裏就完成了,在 MATLAB 中用 imshow 來查看這一步我們得到的圖像(燈箱背景出現的四道條紋是摩爾紋的緣故,無視就好):

2. 白平衡校正(White Balancing)

其實將這一步叫作白平衡校正也並不是很恰當,因爲這並不是指利用各種白平衡算法對圖片的色調進行修復的那個白平衡校正,而僅僅是對 RGB 三通道乘上不同的增益係數,以補償因爲三種濾波片具有不同光譜靈敏度帶來的影響。如果不考慮圖像亮度(亮度的處理我們放在後面),將 R 通道乘以2並保持 G 通道不變,或者將 G 通道乘以0.5並保持 R 通道不變,這兩種方式對畫面顏色變化的影響是等效的。因此我們通常將 G 通道的增益係數固定爲1,僅僅考慮 R 和 B 的係數。關於這兩個係數具體數值應該取多少,則取決於相機的型號以及拍攝時使用的白平衡參數。實際上,在相機的白平衡設置裏選擇不同場景,就是在調整這兩個增益係數。如果想還原爲拍攝時使用的白平衡設置,可以在 Dcraw 中使用 -w -v 參數,這時屏幕上會顯示出當時所使用的 R、B 通道的增益係數。

上圖中的2.433594和1.347656分別表示拍攝這張圖像時所使用的 R 通道和 B 通道的增益。要注意的是,一旦使用了 -w 參數,Dcraw 就會自動完成彩色插值的工作,這樣得到的 tiff 圖像就不再是原始灰度圖像了。因此我們僅僅是使用 -w 來查看增益係數。如果不希望使用拍攝時的白平衡設置,則可以使用 -W 參數,這樣不管當時用的是哪種白平衡檔位,其 R、B 增益都是一個固定的值。例如對於這臺 D3x 來說固定的 R、B 增益分別爲2.625910和1.263930。在實際的圖像處理應用中,通常需要固定相機的白平衡參數,即在相機的白平衡設置中手動輸入色溫。對於使用相同相機白平衡設置(Auto 除外)拍出的圖片,它們都具有相同的增益係數。可以通過 -g 參數手動設置三通道的增益係數,例如 -g 1 1 1 1。

得到了 R、B 通道的增益後,我們需要將相應的像素值乘上這個係數。前面說過,不同相機具有不同的拜耳濾鏡排列方式,因此需要根據實際情況進行增益係數的乘法。這裏我使用的是相機拍攝時的白平衡參數,即 r_multiplier = 2.433594 和 b_multiplier = 1.347656。

wb_multipliers = [2.433594, 1, 1.347656]; % for particular condition, from dcraw;
mask = wbmask(size(lin_bayer,1),size(lin_bayer,2),wb_multipliers,'rggb');
balanced_bayer = lin_bayer .* mask;

上面代碼中的 wbmask 函數就是根據實際拜耳濾鏡的排列生成對應的掩板:

function colormask = wbmask(m,n,wbmults,align)
% COLORMASK = wbmask(M,N,WBMULTS,ALIGN)
% Makes a white-balance multiplicative mask for an image of size m-by-n
% with RGB while balance multipliers WBMULTS = [R_scale G_scale B_scale].
% ALIGN is string indicating Bayer arrangement: 'rggb','gbrg','grbg','bggr'
colormask = wbmults(2) * ones(m,n); % Initialize to all green values;
switch align
 case 'rggb'
  colormask(1:2:end,1:2:end) = wbmults(1); % r
  colormask(2:2:end,2:2:end) = wbmults(3); % b
 case 'bggr'
  colormask(2:2:end,2:2:end) = wbmults(1); % r
  colormask(1:2:end,1:2:end) = wbmults(3); % b
 case 'grbg'
  colormask(1:2:end,2:2:end) = wbmults(1); % r
  colormask(2:2:end,1:2:end) = wbmults(3); % b
 case 'gbrg'
  colormask(2:2:end,1:2:end) = wbmults(1); % r
  colormask(1:2:end,2:2:end) = wbmults(3); % b
 end
end

完成白平衡調整後的圖像如下。由於 R 和 B 通道都乘以了大於1的數,圖像的平均亮度較上一張略有提高了。

3. 色彩插值(又稱去馬賽克,Demosaicking)

上文提到的插值步驟在這一步中實現,經過色彩插值之後原來的灰度圖像就成爲了一幅三通道的彩色圖像。空間插值有非常多的方法,這裏爲了方便我們使用 MATLAB 內置的 Demosaic 函數,它能夠直接把單通道的灰度圖像轉換爲三通道的彩色圖像。由於 Demosaic 函數的輸入必須爲 uint8 或 uint16 類型,我們需要把原來的 double 型先轉換爲 uint16 型。注意這裏的 'rggb' 應該根據相機的具體情況而調整。

temp = uint16(balanced_bayer/max(balanced_bayer(:)) * (2^16-1));
lin_rgb = double(demosaic(temp,'rggb'))/(2^16-1);

完成這一步之後我們就得到了最原始的彩色信息。一些應用中所需要的就是這幅圖像的數據,可以使用 imwrite 函數將其保存在硬盤中。後續的色彩空間轉換、Gamma 校正等步驟視情況決定是否需要執行。色彩插值後得到的圖像如下:

4. 色彩空間轉換(Color Space Conversion)

關於色彩空間這裏不作過多介紹,舉一個最簡單的例子,同樣一幅圖像文件分別在兩臺顯示器上顯示,其各個像素的 RGB 值肯定是一樣的,但是人眼看上去往往都存在細微的顏色偏差,這就是因爲 RGB 色彩空間是設備相關的(Devices-Dependent),而任何兩臺顯示器的 RGB 色彩空間一般都不會完全相同。具體的解釋參考 Wiki。爲了使一幅圖片在各種顯示設備上有儘量一致的視覺效果,我們就需要一個設備無關(Devices-Independent)的色彩空間作爲傳遞媒介。目前在電子設備中用的最多的設備無關的色彩空間(有時也稱絕對色彩空間)就是 sRGB 和 AdobeRGB。如果在 Dcraw 中使用了色彩插值,則自動包含了一個色彩空間變換的過程。Dcraw 先將相機相關的 RGB 空間轉換至 XYZ 空間,然後再從 XYZ 轉換到 sRGB 作爲輸出。在 MATLAB 中我們將這兩個步驟合二爲一。下面我將與相機相關的 RGB 色彩空間稱作 Camera。對於大部分相機,我們可以得到從 XYZ 空間到相機相關空間的變換關係,即已知 XYZ-to-Camera。而作爲兩種絕對色彩空間,sRGB-to-XYZ 也是固定的。根據矩陣運算法則,我們可以得到從相機相關空間到 sRGB 空間的變換關係:

AsRGBCamera=(ACameraXYZAXYZsRGB)1AsRGB←Camera=(ACamera←XYZ⋅AXYZ←sRGB)−1

不同相機的 Camera 不同,因此我們必須獲得適合自己相機的 ACameraXYZACamera←XYZ。在 Dcraw 官網提供的 c 文件中收集了市面上大多數相機的 ACameraXYZACamera←XYZ,可以在 dcraw.c 中的 adobe_coeff 函數下找到,並且這個數據庫是定期更新的。adobe_coeff 函數下的數字是 ACameraXYZACamera←XYZ 中各元素乘以10000後逐行排列的數值,

或者也可以使用 Adobe DNG Converter 這個軟件來查看相機的 ACameraXYZACamera←XYZ。這種方法得到的數值對應了矩陣中逐列排列的各元素。以 D3x 爲例,有:

ACameraXYZ,D3x=110000717180852170198615555251264827187457ACamera←XYZ,D3x=110000[7171−1986−648−8085155552718−217025127457]

而 sRGB-to-XYZ 可以在國際照明委員會(CIE)公佈的標準中查到,有:

AXYZsRGB=0.41245640.21267290.01933390.35757610.71515220.11919200.18043750.07217500.9503041AXYZ←sRGB=[0.41245640.35757610.18043750.21267290.71515220.07217500.01933390.11919200.9503041]

得到了這兩個矩陣,自然也就能夠算出 AsRGBCameraAsRGB←Camera。在色彩空間轉換過程中必須考慮這樣一個問題:由於白色(客觀意義上的白色)在相機的 RGB 空間和 sRGB 空間中都是用[111]T[111]T 來表示,而我們上述白平衡調整的目的就是要確保圖像中白色的部分在任何空間中都呈現出白色。因此以下關係必須成立:

111Camera=ACamerasRGB111sRGB[111]Camera=[ACamera←sRGB][111]sRGB

根據線性代數的知識,要滿足上式,矩陣 ACamerasRGBACamera←sRGB 的每一行元素之和必須爲1,因此在 MATLAB 中我們必須再加上一個步驟,將 ACamerasRGBACamera←sRGB 各行歸一化爲1。色彩空間變換的代碼如下。注意矩陣 XYZ2Cam 請根據自己使用的相機型號進行修改。

sRGB2XYZ = [0.4124564 0.3575761 0.1804375;0.2126729 0.7151522 0.0721750;0.0193339 0.1191920 0.9503041];
% sRGB2XYZ is an unchanged standard
XYZ2Cam = [7171 -1986 -648;-8085 15555 2718;-2170 2512 7457]/10000;
% Here XYZ2Cam is only for Nikon D3X, can be found in adobe_coeff in dcraw.c
sRGB2Cam = XYZ2Cam * sRGB2XYZ;
sRGB2Cam = sRGB2Cam./ repmat(sum(sRGB2Cam,2),1,3); % normalize each rows of sRGB2Cam to 1
Cam2sRGB = (sRGB2Cam)^-1;
lin_srgb = apply_cmatrix(lin_rgb, Cam2sRGB);
lin_srgb = max(0,min(lin_srgb,1)); % Always keep image clipped b/w 0-1

其中 apply_cmatrix 函數就是把我們得到的 AsRGBCameraAsRGB←Camera 應用到原圖像的各個通道上:

function corrected = apply_cmatrix(im,cmatrix)
% Applies CMATRIX to RGB input IM. Finds the appropriate weighting of the
% old color planes to form the new color planes, equivalent to but much
% more efficient than applying a matrix transformation to each pixel.
if size(im,3) ~=3
 error('Apply cmatrix to RGB image only.');
end
r = cmatrix(1,1) * im(:,:,1)+cmatrix(1,2) * im(:,:,2)+cmatrix(1,3) * im(:,:,3);
g = cmatrix(2,1) * im(:,:,1)+cmatrix(2,2) * im(:,:,2)+cmatrix(2,3) * im(:,:,3);
b = cmatrix(3,1) * im(:,:,1)+cmatrix(3,2) * im(:,:,2)+cmatrix(3,3) * im(:,:,3);
corrected = cat(3,r,g,b);

經過色彩空間變換後的圖像如下,可以看出相比變換之前的圖像,各個彩色色塊飽和度明顯增加,而白色色塊顏色保持不變。

5. 亮度校正與伽馬校正(Brightness and Gamma Correction)

對於大部分處於研究目的的圖像處理流程,這一步不建議執行。在這一步之前,我們得到的圖像仍然是與拍攝場景呈線性的,而線性數據往往纔是對分析圖像有幫助的。但是爲了得到更好的顯示效果,亮度與 Gamma 校正通常是必不可少的。如果對最後輸出的圖像存有異議,強烈建議首先返回到這一步中來尋找問題。根據經驗,一張圖像的平均亮度是像素最大值的四分之一時我們認爲它是亮度合適的(注意這條法則不適用於所有場景,例如一張夜景圖像中平均亮度往往會很小)。因此我們調整全局亮度使其符合這一假設:

grayim = rgb2gray(lin_srgb); % Consider only gray channel
grayscale = 0.25/mean(grayim(:));
bright_srgb = min(1,lin_srgb * grayscale); % Always keep image value less than 1

接下來是 Gamma 校正。Gamma 曲線是圖像、信號處理領域使用最爲廣泛的非線性處理,我們最容易見到的就是 Photoshop 中的“曲線”功能,如果將曲線拉成 y=xγy=xγ 的形狀,就相當於對圖像做了一次 Gamma 校正。Gamma 校正是一個很大的話題,這裏不具體介紹,可以參考 Wiki 。在 sRGB 的官方文檔中使用的是 γ=12.4γ=12.4,並在函數值較小的部分應用了小範圍的線性函數。但是現在大多數平臺(Windows,Mac)都使用了 γ=12.2γ=12.2 的曲線,因此這裏我們也使用 2.2 作爲參數,並且不考慮局部的線性化。如果需要精確的 sRGB 標準的校正函數,可以查看其官方文檔。

nl_srgb = bright_srgb.^(1/2.2);

經過亮度校正和 Gamma 校正後的圖像如下。由於使用的 Gamma 曲線是一條凸函數,相當於把圖像暗部的細節展寬,因此得到的圖像要比校正前更亮。

到此爲止一套通用的 Raw Data 處理流程就完成了,接下來可以根據需要再進行一系列的處理過程,比如使用一條 S 型曲線增加圖像對比度、進行白平衡處理等等,或者直接保存爲 tiff 文件再導入到其他圖片處理軟件中進行處理。

下面換一張比較生活化的圖片,再對整個流程做一個展示。


▲ MATLAB 直接讀取由 Dcraw 導出的 tiff 文件


▲ 線性處理後的圖片


▲ 白平衡調整後的圖片,這裏使用 R、B 的增益係數分別爲2.203125和1.378906


▲ 色彩插值後得到的彩色圖片


▲ 轉換至 sRGB 空間後的圖片


▲ 經過亮度校正後的圖片


▲ 經 Gamma 校正後的圖片

References

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章