opencvではRGBからグレーに変換され、グレーからRGBに変換されるのですが、なぜ色が違うのでしょうか?

#include <opencv2/opencv.hpp>

int main()
{
    // 读取RGB图像
    cv::Mat rgbImage = cv::imread("image.jpg");

    // 将RGB图像转换为灰度图像
    cv::Mat grayImage;
    cv::cvtColor(rgbImage, grayImage, cv::COLOR_RGB2GRAY);

    // 将灰度图像转换回RGB图像
    cv::Mat rgbImage2;
    cv::cvtColor(grayImage, rgbImage2, cv::COLOR_GRAY2RGB);

    // 输出结果
    cv::imshow("RGB Image", rgbImage);
    cv::imshow("Gray Image", grayImage);
    cv::imshow("RGB Image 2", rgbImage2);
    cv::waitKey(0);

    return 0;
}

RGB イメージをグレースケール イメージに変換すると、グレースケール イメージには明るさの情報のみが含まれ、色の情報は含まれないため、色情報が失われます。グレースケール イメージには、赤、緑、青のチャネルの組み合わせではなく、明るさレベルを表すチャネルがピクセルごとに 1 つだけあります。

グレースケール イメージを再び RGB イメージに変換すると、OpenCV は各グレースケール ピクセル値を RGB 空間にマッピングし直します。グレースケール イメージには輝度値のチャネルが 1 つしかないため、RGB イメージ内のすべてのチャネルには同じ値が割り当てられます。このように、画像はグレースケール画像のように見えますが、実際には各チャネルで同じグレースケール値が使用されているだけです。

グレースケール イメージを元の RGB イメージに変換し、色を変更しないようにしたい場合は、RGB イメージをグレースケールに変換するときに色情報が失われるため、それは不可能です。グレースケール画像には明るさの情報のみが含まれており、元の画像の赤、緑、青のチャネル値は含まれません。したがって、グレースケール画像から元の RGB カラーを復元することはできません。

変換中に色情報を保持したい場合は、より多くの色情報を保持できる HSV や Lab などの他の色空間を使用する必要があります。ただし、他の色空間を使用した場合でも、色情報の変換には必ず一定の損失が生じるため、元の RGB 色を完全に復元することはできません。

おすすめ

転載: blog.csdn.net/pingchangxin_6/article/details/131658057