読者です 読者をやめる 読者になる 読者になる

OpenCVを使ってLenaさんを白黒にする。(0004)

OpenCVを使ってLenaさんを白黒にする。
グレースケールの画像とカラーだけど白黒画像を作ってみる。

#include <string>
#include <opencv2/opencv.hpp>

//画面をだすよ
void display(cv::Mat image) {
    //名前をつける
    std::string windowName = "windowName";
    cv::namedWindow(windowName);
    //画面出た!!
    cv::imshow(windowName, image);
    //なにかキーをおして~
    cv::waitKey(0);
    //整理整頓
    cv::destroyWindow(windowName);
}

//
// ここから
//
int main(int argc, char** argv) {

    //lenaさん登場!!
    cv::Mat lena = cv::imread("lena.jpg");
    int cols = lena.cols;
    int rows = lena.rows;

    //lenaさんと同じサイズのグレースケール画像
    cv::Mat image = cv::Mat::zeros(cols, rows, CV_8UC1);
    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < cols; i++) {
            image.at<uchar>(j, i) =
                    (lena.at<cv::Vec3b>(j, i)[0] +
                     lena.at<cv::Vec3b>(j, i)[1] +
                     lena.at<cv::Vec3b>(j, i)[2]
                    ) / 3;
        }
    }
    //画面に出して!!
    display(image);

    //lenaさんと同じサイズのカラー画像
    cv::Mat image2 = cv::Mat::zeros(cols, rows, CV_8UC3);
    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < cols; i++) {
            int pix =
                    (lena.at<cv::Vec3b>(j, i)[0] +
                     lena.at<cv::Vec3b>(j, i)[1] +
                     lena.at<cv::Vec3b>(j, i)[2]
                    ) / 3;
            image2.at<cv::Vec3b>(j, i)[0] = pix; //青
            image2.at<cv::Vec3b>(j, i)[1] = pix; //緑
            image2.at<cv::Vec3b>(j, i)[2] = pix; //赤
        }
    }
    //画面に出して!!
    display(image2);
}

f:id:treehitsuji:20150118142431p:plain