opencv:从RGB转换为灰度,只获得蓝色

时间:2017-12-10 17:41:55

标签: c++ image opencv

我尝试使用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。
我用各种方法得到蓝色比例。

1 个答案:

答案 0 :(得分:0)

您确定只有3个频道吗?

无论如何:

uint8_t weightedAverage3(Vec3b color){
    uint8_t gray = 0.301 * (float)color[0] + 0.587 * (float)color[1] + 0.114 * (float)color[2];

    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<uchar>(Point(x, y)) = weightedAverage3(color);
        }
    }
}

假设0是R,1是G,2是B。