1
- use crate :: { Image , RawImage } ;
1
+ use crate :: { Pixel , RawImage } ;
2
2
3
3
fn average ( data : & [ u16 ] , indexes : impl Iterator < Item = i64 > ) -> u16 {
4
4
let mut sum = 0 ;
@@ -13,62 +13,69 @@ fn average(data: &[u16], indexes: impl Iterator<Item = i64>) -> u16 {
13
13
( sum / count) as u16
14
14
}
15
15
16
- pub fn linear_demosaic ( raw_image : RawImage ) -> Image < u16 > {
17
- match raw_image. cfa_pattern {
18
- [ 0 , 1 , 1 , 2 ] => linear_demosaic_rggb ( raw_image) ,
19
- _ => todo ! ( ) ,
16
+ impl RawImage {
17
+ pub fn linear_demosaic_iter ( & self ) -> impl Iterator < Item = Pixel > + use < ' _ > {
18
+ match self . cfa_pattern {
19
+ [ 0 , 1 , 1 , 2 ] => self . linear_demosaic_rggb_iter ( ) ,
20
+ _ => todo ! ( ) ,
21
+ }
20
22
}
21
- }
22
23
23
- fn linear_demosaic_rggb ( raw_image : RawImage ) -> Image < u16 > {
24
- let mut image = vec ! [ 0 ; raw_image. width * raw_image. height * 3 ] ;
25
- let width = raw_image. width as i64 ;
26
- let height = raw_image. height as i64 ;
24
+ fn linear_demosaic_rggb_iter ( & self ) -> impl Iterator < Item = Pixel > + use < ' _ > {
25
+ let width = self . width as i64 ;
26
+ let height = self . height as i64 ;
27
27
28
- for row in 0 ..height {
29
- let row_by_width = row * width;
28
+ ( 0 ..height) . flat_map ( move |row| {
29
+ let row_by_width = row * width;
30
30
31
- for col in 0 ..width {
32
- let pixel_index = row_by_width + col ;
31
+ ( 0 ..width) . map ( move |column| {
32
+ let pixel_index = row_by_width + column ;
33
33
34
- let vertical_indexes = [ pixel_index + width, pixel_index - width] ;
35
- let horizontal_indexes = [ pixel_index + 1 , pixel_index - 1 ] ;
36
- let cross_indexes = [ pixel_index + width, pixel_index - width, pixel_index + 1 , pixel_index - 1 ] ;
37
- let diagonal_indexes = [ pixel_index + width + 1 , pixel_index - width + 1 , pixel_index + width - 1 , pixel_index - width - 1 ] ;
34
+ let vertical_indexes = [ pixel_index + width, pixel_index - width] ;
35
+ let horizontal_indexes = [ pixel_index + 1 , pixel_index - 1 ] ;
36
+ let cross_indexes = [ pixel_index + width, pixel_index - width, pixel_index + 1 , pixel_index - 1 ] ;
37
+ let diagonal_indexes = [ pixel_index + width + 1 , pixel_index - width + 1 , pixel_index + width - 1 , pixel_index - width - 1 ] ;
38
38
39
- let pixel_index = pixel_index as usize ;
40
- match ( row % 2 == 0 , col % 2 == 0 ) {
41
- ( true , true ) => {
42
- image[ 3 * pixel_index] = raw_image. data [ pixel_index] ;
43
- image[ 3 * pixel_index + 1 ] = average ( & raw_image. data , cross_indexes. into_iter ( ) ) ;
44
- image[ 3 * pixel_index + 2 ] = average ( & raw_image. data , diagonal_indexes. into_iter ( ) ) ;
45
- }
46
- ( true , false ) => {
47
- image[ 3 * pixel_index] = average ( & raw_image. data , horizontal_indexes. into_iter ( ) ) ;
48
- image[ 3 * pixel_index + 1 ] = raw_image. data [ pixel_index] ;
49
- image[ 3 * pixel_index + 2 ] = average ( & raw_image. data , vertical_indexes. into_iter ( ) ) ;
50
- }
51
- ( false , true ) => {
52
- image[ 3 * pixel_index] = average ( & raw_image. data , vertical_indexes. into_iter ( ) ) ;
53
- image[ 3 * pixel_index + 1 ] = raw_image. data [ pixel_index] ;
54
- image[ 3 * pixel_index + 2 ] = average ( & raw_image. data , horizontal_indexes. into_iter ( ) ) ;
39
+ let pixel_index = pixel_index as usize ;
40
+ match ( row % 2 == 0 , column % 2 == 0 ) {
41
+ ( true , true ) => Pixel {
42
+ values : [
43
+ self . data [ pixel_index] ,
44
+ average ( & self . data , cross_indexes. into_iter ( ) ) ,
45
+ average ( & self . data , diagonal_indexes. into_iter ( ) ) ,
46
+ ] ,
47
+ row : row as usize ,
48
+ column : column as usize ,
49
+ } ,
50
+ ( true , false ) => Pixel {
51
+ values : [
52
+ average ( & self . data , horizontal_indexes. into_iter ( ) ) ,
53
+ self . data [ pixel_index] ,
54
+ average ( & self . data , vertical_indexes. into_iter ( ) ) ,
55
+ ] ,
56
+ row : row as usize ,
57
+ column : column as usize ,
58
+ } ,
59
+ ( false , true ) => Pixel {
60
+ values : [
61
+ average ( & self . data , vertical_indexes. into_iter ( ) ) ,
62
+ self . data [ pixel_index] ,
63
+ average ( & self . data , horizontal_indexes. into_iter ( ) ) ,
64
+ ] ,
65
+ row : row as usize ,
66
+ column : column as usize ,
67
+ } ,
68
+ ( false , false ) => Pixel {
69
+ values : [
70
+ average ( & self . data , diagonal_indexes. into_iter ( ) ) ,
71
+ average ( & self . data , cross_indexes. into_iter ( ) ) ,
72
+ self . data [ pixel_index] ,
73
+ ] ,
74
+ row : row as usize ,
75
+ column : column as usize ,
76
+ } ,
55
77
}
56
- ( false , false ) => {
57
- image[ 3 * pixel_index] = average ( & raw_image. data , diagonal_indexes. into_iter ( ) ) ;
58
- image[ 3 * pixel_index + 1 ] = average ( & raw_image. data , cross_indexes. into_iter ( ) ) ;
59
- image[ 3 * pixel_index + 2 ] = raw_image. data [ pixel_index] ;
60
- }
61
- }
62
- }
63
- }
64
-
65
- Image {
66
- channels : 3 ,
67
- data : image,
68
- width : raw_image. width ,
69
- height : raw_image. height ,
70
- transform : raw_image. transform ,
71
- rgb_to_camera : raw_image. rgb_to_camera ,
72
- histogram : None ,
78
+ } )
79
+ } )
73
80
}
74
81
}
0 commit comments