英文:
Bayer filter, bayer demosaicing OpenCV C++
问题
我在bayer解码(OpenCV C++)方面遇到了一些问题。
我需要将图像从Bayer马赛克格式转换为正常版本。
我尝试使用cv::cvtColor
和cv::COLOR_BayerGB2BGR
,但输出图像看起来很“绿”,我不明白为什么。
我也尝试了一些方式来使用双线性插值的cv::demosaicing
,但也没有帮助。
我知道输出图像应该比输入图像小两倍,因为我们需要从4个像素中获取一个,但我不知道如何正确实现它。
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat bayer_img = cv::imread("bayer_image2.png", cv::IMREAD_GRAYSCALE);
cv::Mat rgb_img;
cv::cvtColor(bayer_img, rgb_img, cv::COLOR_BayerGBRG2BGR);
cv::Mat demosaiced_img;
cv::cvtColor(rgb_img, demosaiced_img, cv::COLOR_BGR2RGB);
cv::Mat resized_img;
cv::resize(demosaiced_img, resized_img, cv::Size(), 0.5, 0.5);
cv::imwrite("bayer_image_output.png", resized_img);
}
英文:
I have some troubles with bayer-demosaicing (OpenCV C++).
I need to convert the image from the Bayer mosaic to the normal version.
I tried to use the cv::cvtColor
with cv::COLOR_BayerGB2BGR
, but the output image looks so "green" , and I don't understand why.
I also tryed to somehow use cv::demosaicing
for bilinear interpolation, but that didn't help either.
I know that the output image should be two times smaller than the input one, because we have to get 1 out of 4 pixels, but I don't understand how to implement it correctly.
Upd:
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat bayer_img = cv::imread("bayer_image2.png", cv::IMREAD_GRAYSCALE);
cv::Mat rgb_img;
cv::cvtColor(bayer_img, rgb_img, cv::COLOR_BayerGBRG2BGR);
cv::Mat demosaiced_img;
cv::cvtColor(rgb_img, demosaiced_img, cv::COLOR_BGR2RGB);
cv::Mat resized_img;
cv::resize(demosaiced_img, resized_img, cv::Size(), 0.5, 0.5);
cv::imwrite("bayer_image_output.png", resized_img);
}
答案1
得分: 1
在你的代码中,你正在使用cv::COLOR_BayerGBRG2BGR进行转换,这可能与你的输入图像的实际Bayer模式不匹配。你看到的绿色输出可能是使用不正确的转换引起的。
要解决这个问题,你需要确定你的输入图像的正确Bayer模式,并使用适当的转换代码。最常见的Bayer模式有BayerBG、BayerGB、BayerRG和BayerGR。你应该根据你的摄像机传感器或图像来源选择正确的模式。
英文:
In your code, you are using cv::COLOR_BayerGBRG2BGR for the conversion, which may not match the actual Bayer pattern of your input image.
The greenish output you are seeing could be a result of using the incorrect conversion.
To solve this problem, you need to determine the correct Bayer pattern of your input image and use the appropriate conversion code. The most common Bayer patterns are BayerBG, BayerGB, BayerRG, and BayerGR. You should choose the correct pattern based on your camera sensor or image source.
答案2
得分: 0
Debayered pictures still need to be white-balanced. The raw sensor values aren't balanced.
There are various methods. You can
- determine the balance manually (e.g. take the mean of each color plane) and then scale each color channel accordingly
- apply histogram equalization to each color plane
- anything more complex, to be found via research
英文:
Debayered pictures still need to be white-balanced. The raw sensor values aren't balanced.
There are various methods. You can
- determine the balance manually (e.g. take the mean of each color plane) and then scale each color channel accordingly
- apply histogram equalization to each color plane
- anything more complex, to be found via research
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论