31 #include <libopenraw/demosaic.h>
33 void bimedian_demosaic (uint16_t *src, uint32_t src_x, uint32_t src_y,
34 or_cfa_pattern pattern, uint8_t *dst);
46 m4 (
float a,
float b,
float c,
float d)
87 bimedian_demosaic (uint16_t *src, uint32_t src_x, uint32_t src_y,
88 or_cfa_pattern pattern, uint8_t *dst)
91 uint32_t offset, doffset;
97 case OR_CFA_PATTERN_GRBG:
100 case OR_CFA_PATTERN_BGGR:
103 case OR_CFA_PATTERN_GBRG:
106 case OR_CFA_PATTERN_RGGB:
113 src_buf = (
float*)calloc(src_x * src_y,
sizeof(
float));
114 dst_buf = (
float*)calloc(src_x * src_y * 3,
sizeof(
float));
116 std::copy(src, src + (src_x * src_y), src_buf);
120 for(y = 1 ; y < src_y - 1; y++)
122 for (x = 1 ; x < src_x - 1; x++)
128 if ((y + npattern%2)%2==0) {
129 if ((x+npattern/2)%2==1) {
134 blue =(src_buf[offset-COL]+src_buf[offset+COL])/2.0;
135 green=src_buf[offset];
136 red =(src_buf[offset-ROW]+src_buf[offset+ROW])/2.0;
143 blue =src_buf[offset];
144 green=m4(src_buf[offset-ROW], src_buf[offset-COL],
145 src_buf[offset+COL], src_buf[offset+ROW]);
146 red =m4(src_buf[offset-ROW-COL], src_buf[offset-ROW+COL],
147 src_buf[offset+ROW-COL], src_buf[offset+ROW+COL]);
151 if ((x+npattern/2)%2==1) {
156 blue =m4(src_buf[offset-ROW-COL], src_buf[offset-ROW+COL],
157 src_buf[offset+ROW-COL], src_buf[offset+ROW+COL]);
158 green=m4(src_buf[offset-ROW], src_buf[offset-COL],
159 src_buf[offset+COL], src_buf[offset+ROW]);
160 red =src_buf[offset];
167 blue =(src_buf[offset-ROW]+src_buf[offset+ROW])/2.0;
168 green=src_buf[offset];
169 red =(src_buf[offset-COL]+src_buf[offset+COL])/2.0;
173 dst_buf [doffset*3+0] = red / 16.0;
174 dst_buf [doffset*3+1] = green / 16.0;
175 dst_buf [doffset*3+2] = blue / 16.0;
182 std::copy(dst_buf, dst_buf + (src_x * src_y * 3), dst);