#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 色を完全に復元することはできません。