【发布时间】:2017-12-10 17:41:54
【问题描述】:
我正在尝试使用 OpenCV 和 C++ 将一些 RGB 彩色图像转换为灰度图像,但我唯一能得到的是蓝色图像。
Original
"Converted"
Vec3b simpleAveraging(Vec3b color){
Vec3b gray = ((float)color[0] + (float)color[1] + (float)color[2]) / 3.0;
return gray;
}
Vec3b weightedAverage1(Vec3b color){
Vec3b gray = 0.3 * (float)color[2] + 0.59 * (float)color[1] + 0.11 * (float)color[0];
return gray;
}
Vec3b weightedAverage2(Vec3b color){
Vec3b gray = 0.2126 * (float)color[2] + 0.7152 * (float)color[1] + 0.0722 * (float)color[0];
return gray;
}
Vec3b weightedAverage3(Vec3b color){
Vec3b gray = 0.299 * (float)color[2] + 0.587 * (float)color[1] + 0.114 * (float)color[0];
return gray;
}
...
for(int i = 0; i < 12; i++){
for(int y = 0; y < img[i].rows; y++){
for(int x = 0; x < img[i].cols; x++){
color = img[i].at<Vec3b>(Point(x, y));
img[i].at<Vec3b>(Point(x, y)) = weightedAverage3(color);
}
}
}
这是一个大学项目,我的教授告诉我使用这些算法,所以我不能使用 CV_RGB2GRAY。
我用每种方法都得到了蓝色刻度。
【问题讨论】:
-
要么将 img 类型设置为 CV_8UC1(灰度),要么将初始 3 通道图像的所有 3 个通道设置为 weightedAverage3(颜色)。现在您只设置第一个蓝色通道。
-
灰度图像只有一个通道,所以返回一个
cv::Vec3b没有意义,它应该是一个uint8_t。