2 基本的な処理
2.1 準備
2.1.1 RAW画像の準備
RStudioのTerminalタブで以下を実行して、RAW画像ファイルをダウンロードします。
wget https://github.com/moizumi99/camera_raw_processing/raw/master/chart.jpg
2.1.2 RAW画像の読み込み
必要なパッケージを読み込み
library(reticulate)
library(imager)
reticulate::import
でPythonのrawpy
モジュールをインポート
rawpy <- import("rawpy")
画像の読み込み
raw_file <- "chart.jpg"
raw <- rawpy$imread(raw_file)
画像データをRの行列に読み込み
raw_array <- raw$raw_image
サイズの確認
raw_array %>% dim
## [1] 2464 3280
画像を表示
raw_array %>% t %>% as.cimg %>% plot
2.2 簡易デモザイク処理
2.2.1 RAW画像の確認
拡大表示
raw_array %>% t %>% as.cimg %>%
imsub(x %inr% c(2641, 2700), y %inr% c(1341, 1400)) %>%
plot(interpolate = FALSE)
RAW画像のBayer配列を確認
raw$raw_pattern
## [,1] [,2]
## [1,] 2 3
## [2,] 1 0
Bayer配列に対応するRGB画像を作リます。
raw_color <- array(0, c(dim(raw_array), 1, 3))
raw_color[c(T, F), c(T, F), 1, 3] <- raw_array[c(T, F), c(T, F)]
raw_color[c(T, F), c(F, T), 1, 2] <- raw_array[c(T, F), c(F, T)]
raw_color[c(F, T), c(T, F), 1, 2] <- raw_array[c(F, T), c(T, F)]
raw_color[c(F, T), c(F, T), 1, 1] <- raw_array[c(F, T), c(F, T)]
画像の行と列を入れ替える補助関数
ta <- function(a) aperm(a, c(2, 1, 3, 4))
表示
raw_color %>% ta %>% as.cimg %>% plot
拡大表示
raw_color %>% ta %>% as.cimg %>%
imsub(x %inr% c(2641, 2700), y %inr% c(1341, 1400)) %>%
plot(interpolate = FALSE)
2.2.2 簡易デモザイク処理
簡易デモザイク処理
simple_demosaic <- function(raw_array) {
dms_img <- array(0, c(dim(raw_array) / 2, 1, 3))
dms_img[,, 1, 3] <- raw_array[c(T, F), c(T, F)]
dms_img[,, 1, 2] <- (raw_array[c(T, F), c(F, T)] + raw_array[c(F, T), c(T, F)]) / 2
dms_img[,, 1, 1] <- raw_array[c(F, T), c(F, T)]
dms_img
}
デモザイクして表示
raw_array %>% simple_demosaic %>% ta %>% as.cimg %>% plot
2.3 ホワイトバランス補正
2.3.1 ホワイトバランス補正処理
ホワイトバランスのゲインを確認
raw$camera_whitebalance
## [1] 1.128 1.000 2.546 1.000
ホワイトバランス補正処理
white_balance <- function(raw_array, wb_gain, raw_colors) {
norm <- wb_gain[2]
gain_matrix <- array(0, c(dim(raw_array)))
for (color in 0:3) {
gain_matrix[raw_colors == color] <- wb_gain[color + 1] / norm
}
raw_array * gain_matrix
}
ホワイトバランス補正して簡易デモザイク
gain <- raw$camera_whitebalance
colors <- raw$raw_colors
dms_img <- white_balance(raw_array, gain, colors) %>% simple_demosaic
画像を0と1の間でノーマライズする補助関数
normalize <- function(img) {
img <- img / 1024
img[img < 0] <- 0
img[img > 1] <- 1
img
}
表示
dms_img %>% normalize %>% ta %>% as.cimg %>% plot
2.4 ブラックレベル補正
2.4.1 ブラックレベル補正処理
ブラックレベルを確認
blc <- raw$black_level_per_channel
blc
## [1] 66 66 66 66
ブラックレベル補正処理
black_level_correction <- function(raw_array, blc, pattern) {
pattern <- pattern + 1
raw_array[c(T, F), c(T, F)] <- raw_array[c(T, F), c(T, F)] - blc[pattern[1, 1]]
raw_array[c(T, F), c(F, T)] <- raw_array[c(T, F), c(F, T)] - blc[pattern[1, 2]]
raw_array[c(F, T), c(T, F)] <- raw_array[c(F, T), c(T, F)] - blc[pattern[2, 1]]
raw_array[c(F, T), c(F, T)] <- raw_array[c(F, T), c(F, T)] - blc[pattern[2, 2]]
raw_array
}
確認
dms_img <- raw_array %>%
black_level_correction(blc, raw$raw_pattern) %>%
white_balance(raw$camera_whitebalance, raw$raw_colors) %>%
simple_demosaic
dms_img %>% normalize %>% ta %>% as.cimg %>% plot
2.5 ガンマ補正
2.5.1 ガンマ補正とは
ガンマカーブ
curve(x ^ 2.2, 0, 1)
ガンマ補正カーブ
curve(x ^ (1 / 2.2), 0, 1)
2.5.2 ガンマ補正処理
ガンマ補正処理
gamma_correction <- function(input_img, gamma) {
input_img[input_img < 0] <- 0
input_img[input_img > 1] <- 1
input_img ^ (1 / gamma)
}
確認
dms_img %>% normalize %>% gamma_correction(2.2) %>% ta %>% as.cimg %>% plot