31 #include <libopenraw/consts.h> 33 #include "bimedian_demosaic.hpp" 40 m4 (
double a,
double b,
double c,
double d)
81 bimedian_demosaic (uint16_t *src, uint32_t src_x, uint32_t src_y,
82 or_cfa_pattern pattern, uint8_t *dst, uint32_t &out_x, uint32_t &out_y)
85 uint32_t offset, doffset;
91 case OR_CFA_PATTERN_GRBG:
94 case OR_CFA_PATTERN_BGGR:
97 case OR_CFA_PATTERN_GBRG:
100 case OR_CFA_PATTERN_RGGB:
106 return OR_ERROR_INVALID_FORMAT;
110 src_buf = (
double*)calloc(src_x * src_y,
sizeof(*src_buf));
111 dst_buf = (
double*)calloc(src_x * src_y * 3,
sizeof(*dst_buf));
113 std::copy(src, src + (src_x * src_y), src_buf);
117 for(y = 1 ; y < src_y - 1; y++)
119 for (x = 1 ; x < src_x - 1; x++)
125 if ((y + npattern%2)%2==0) {
126 if ((x+npattern/2)%2==1) {
131 blue =(src_buf[offset-COL]+src_buf[offset+COL])/2.0;
132 green=src_buf[offset];
133 red =(src_buf[offset-ROW]+src_buf[offset+ROW])/2.0;
140 blue =src_buf[offset];
141 green=m4(src_buf[offset-ROW], src_buf[offset-COL],
142 src_buf[offset+COL], src_buf[offset+ROW]);
143 red =m4(src_buf[offset-ROW-COL], src_buf[offset-ROW+COL],
144 src_buf[offset+ROW-COL], src_buf[offset+ROW+COL]);
148 if ((x+npattern/2)%2==1) {
153 blue =m4(src_buf[offset-ROW-COL], src_buf[offset-ROW+COL],
154 src_buf[offset+ROW-COL], src_buf[offset+ROW+COL]);
155 green=m4(src_buf[offset-ROW], src_buf[offset-COL],
156 src_buf[offset+COL], src_buf[offset+ROW]);
157 red =src_buf[offset];
164 blue =(src_buf[offset-ROW]+src_buf[offset+ROW])/2.0;
165 green=src_buf[offset];
166 red =(src_buf[offset-COL]+src_buf[offset+COL])/2.0;
170 dst_buf [doffset*3+0] = red / 16.0;
171 dst_buf [doffset*3+1] = green / 16.0;
172 dst_buf [doffset*3+2] = blue / 16.0;
181 std::copy(dst_buf, dst_buf + (out_x * out_y * 3), dst);
185 return OR_ERROR_NONE;