3 ways to use opencv to change an image from RGB to gray

 

image

 

上圖就是我們這次所要呈現的結果,教學開始:

 

第一種

      這是我覺得最簡潔的方式,直接在 imread() 加入參數 0 就可以了,如下方程式碼:

 

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
 Mat original = imread("Lenna.jpg");
 Mat gray = imread("Lenna.jpg", 0);
 //or Mat gray = imread("Lenna.jpg", IMREAD_GRAYSCALE);

 imshow("original image", original);
 imshow("gray image", gray);

 waitKey();
}

 

相關參數可參考下方:

imageimage

第二種

      使用 cvtColor() 並搭配參數 COLOR_BGR2GRAY,如下方程式碼:

 

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
 Mat original = imread("Lenna.jpg");
 Mat gray;

 cvtColor(original, gray, COLOR_BGR2GRAY); // convert to grayscale

 imshow("original image", original);
 imshow("gray image", gray);

 waitKey();
}

 

第三種

      使用 RGB to gray 的轉換公式自行去對每一個 pixel 去處理公式及程式碼如下:

image

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
 Mat original = imread("Lenna.jpg");
 Mat gray = Mat::zeros(original.rows, original.cols, CV_8UC1);

 int rows = original.rows;
 int cols = original.cols;
 int channel = original.channels();

 for (int i = 0; i < rows; i++) {
 for (int j = 0; j < cols; j++) {
 if (channel == 3) {
 //opencv 圖片的顏色順序為 B G R ,如下
 int b = original.at<Vec3b>(i, j)[0];
 int g = original.at<Vec3b>(i, j)[1];
 int r = original.at<Vec3b>(i, j)[2];

 gray.at<uchar>(i, j) = 0.299 * r + 0.587 * g + 0.114 * b;
 }

 }
 }

 imshow("original image", original);
 imshow("gray image", gray);

 waitKey();
}



如需更多客製化服務:


另外有安裝或者其他使用上的問題,皆可參考下列篇章:

如有任何問題歡迎下方留言討論!!!