RGRGRGRG
GBGBGBGB
RGRGRGRG
GBGBGBGB
This pattern is not perfect, but is highly effective. Luma (color-independent) resolution is essentially equivalent to the actual number of pixels, while chroma (color-dependent) resolution is only slightly less - we essentially get one "real" point of color information at each intersection of four color pixels, because at each of those intersections we have one red, one blue, and two green pixels. RRGGRRGG
RRGGRRGG
GGBBGGBB
GGBBGGBB
I'm concerned that chroma resolution and overall color accuracy will be much lower with this pattern. Essentially, with the original Bayer demosaicing, you only need to sample from the four color pixels adjacent to each corner in order to get a bit of the three channels, and the pattern gives equal weight to both red and blue, while providing extra accuracy in the green channel that human vision is most sensitive to. f(B, 4, 4, 2, 1) =>
(
((1,2,1),(1,2,1),(1,2,1)),
((1,2,1),(1,2,1),(1,2,1)),
((1,2,1),(1,2,1),(1,2,1))
)
The 9-pixel-effective-pixel Quad Bayer pattern produces this: f(Q, 4, 4, 3, 1) =>
(
((4,4,1),(2,5,2)),
((2,5,2),(1,4,4))
)
Note that there are fewer effective pixels for the same total number of pixels - that's okay, though, because the number of effective pixels approaches the number of total pixels as the sensor scales in the X and Y dimensions - this very small hypothetical sensor doesn't benefit from that scale yet. f(B, 4, 4, 3, 1) =>
(
((4,4,1),(2,5,2)),
((2,5,2),(1,4,4))
)
Interestingly, while the exact arrangements of the different color channels within the effective pixels are different, the total number of pixels of each channel remains completely identical, meaning that any given effective pixel should have identical noise characteristics to the Quad Bayer pattern. In fact, it's arguable that the Bayer pattern is better, because the color physical pixels are more evenly distributed around the effective pixel. f(Q, 8, 8, 4, 2) =>
(
((4,8,4),(4,8,4),(4,8,4)),
((4,8,4),(4,8,4),(4,8,4)),
((4,8,4),(4,8,4),(4,8,4))
)
And for the standard Bayer, like this: f(B, 8, 8, 4, 2) =>
(
((4,8,4),(4,8,4),(4,8,4)),
((4,8,4),(4,8,4),(4,8,4)),
((4,8,4),(4,8,4),(4,8,4))
)
Again, sampling in a similar pattern gives the same overall result. So, all else being equal, I'm not sure it makes sense.
I have verified that Requests, which uses us, appears to have its own handling, back at least to requests 2.0 (released in 2013) that prevents this when used directly as an abstraction layer on top of urllib3.