mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-30 06:08:12 +08:00
Raw-rs: Add preprocessing and demosaicing steps (#1796)
* add subtract black step * add scale colors step * add raw to image step * implement linear demosiacing and fix errors in previous code * fix missing variable * make dependencies of tests optional * fix error in raw-rs tests * fix typo in "demosiacing" * use camera data from ADC and remove downloader * cargo fmt * use file_stem instead of file_name * remove old camera data * use equality instead of subtring to find model * store camera_to_xyz in decimal form * Code review --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
co-authored by
Keavon Chambers
parent
1b6d45ad30
commit
a9cfeeb219
@@ -0,0 +1,77 @@
|
||||
use crate::{Image, RawImage};
|
||||
|
||||
fn average(data: &[u16], indexes: impl Iterator<Item = i64>) -> u16 {
|
||||
let mut sum = 0;
|
||||
let mut count = 0;
|
||||
for index in indexes {
|
||||
if index >= 0 && (index as usize) < data.len() {
|
||||
sum += data[index as usize] as u32;
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
|
||||
(sum / count) as u16
|
||||
}
|
||||
|
||||
pub fn linear_demosaic(raw_image: RawImage) -> Image<u16> {
|
||||
match raw_image.cfa_pattern {
|
||||
[0, 1, 1, 2] => linear_demosaic_rggb(raw_image),
|
||||
_ => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
fn linear_demosaic_rggb(mut raw_image: RawImage) -> Image<u16> {
|
||||
let width = raw_image.width as i64;
|
||||
let height = raw_image.height as i64;
|
||||
|
||||
for row in 0..height {
|
||||
let row_by_width = row * width;
|
||||
|
||||
for col in 0..width {
|
||||
let pixel_index = row_by_width + col;
|
||||
|
||||
let vertical_indexes = [pixel_index + width, pixel_index - width];
|
||||
let horizontal_indexes = [pixel_index + 1, pixel_index - 1];
|
||||
let cross_indexes = [pixel_index + width, pixel_index - width, pixel_index + 1, pixel_index - 1];
|
||||
let diagonal_indexes = [pixel_index + width + 1, pixel_index - width + 1, pixel_index + width - 1, pixel_index - width - 1];
|
||||
|
||||
match (row % 2 == 0, col % 2 == 0) {
|
||||
(true, true) => {
|
||||
let indexes = cross_indexes.iter().map(|x| 3 * x + 1);
|
||||
raw_image.data[3 * (pixel_index as usize) + 1] = average(&raw_image.data, indexes);
|
||||
|
||||
let indexes = diagonal_indexes.iter().map(|x| 3 * x + 2);
|
||||
raw_image.data[3 * (pixel_index as usize) + 2] = average(&raw_image.data, indexes);
|
||||
}
|
||||
(true, false) => {
|
||||
let indexes = horizontal_indexes.iter().map(|x| 3 * x);
|
||||
raw_image.data[3 * (pixel_index as usize)] = average(&raw_image.data, indexes);
|
||||
|
||||
let indexes = vertical_indexes.iter().map(|x| 3 * x + 2);
|
||||
raw_image.data[3 * (pixel_index as usize) + 2] = average(&raw_image.data, indexes);
|
||||
}
|
||||
(false, true) => {
|
||||
let indexes = vertical_indexes.iter().map(|x| 3 * x);
|
||||
raw_image.data[3 * (pixel_index as usize)] = average(&raw_image.data, indexes);
|
||||
|
||||
let indexes = horizontal_indexes.iter().map(|x| 3 * x + 2);
|
||||
raw_image.data[3 * (pixel_index as usize) + 2] = average(&raw_image.data, indexes);
|
||||
}
|
||||
(false, false) => {
|
||||
let indexes = cross_indexes.iter().map(|x| 3 * x + 1);
|
||||
raw_image.data[3 * (pixel_index as usize) + 1] = average(&raw_image.data, indexes);
|
||||
|
||||
let indexes = diagonal_indexes.iter().map(|x| 3 * x);
|
||||
raw_image.data[3 * (pixel_index as usize)] = average(&raw_image.data, indexes);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
channels: 3,
|
||||
data: raw_image.data,
|
||||
width: raw_image.width,
|
||||
height: raw_image.height,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub mod linear_demosaicing;
|
||||
Reference in New Issue
Block a user