close

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();
}



如需更多客製化服務:


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

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

arrow
arrow
    創作者介紹
    創作者 微笑創客 的頭像
    微笑創客

    微笑創客 Smile assassin

    微笑創客 發表在 痞客邦 留言(0) 人氣()