『OpenCVによる画像処理入門』練習問題7.1(一部)


『OpenCVによる画像処理入門』の練習問題7.1をやった。

練習問題7.1

1

Q. 図7.7にSobelオペレータを適用すると、どのような画像が得られるか。適用結果をグレースケール画像として表示するために必要な処理は何か。

図7.7

Sobelオペレータ:エッジ(輪郭)検出に使用するオペレータ。
グレースケール画像:色味のない明るさの度合いだけで表現した画像

図7.7の画像を表示するプログラム

sub15_1.cpp
//画面表示
void display(cv::Mat image) {
    std::string windowName = "windowName";
    cv::namedWindow(windowName, CV_WINDOW_NORMAL/2);
    cv::imshow(windowName, image);
    cv::waitKey(0);
}

int sub15() {
    // 7×7の画像、1ch
    cv::Mat image = cv::Mat::zeros(8, 8, CV_8UC1);
    int cols = image.cols;
    int rows = image.rows;

    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < cols; i++) {
            if((2<=j && j<=5) && (2 <= i && i <= 5))
            {
                image.at<unsigned char>(j, i) = 255;
            }
            else
            {
                image.at<unsigned char>(j, i) = 0;
            }
        }
    }
    //画面に出力
    display(image);
    return 0;
}

出力画像

図7.7にSobelオペレータを適用するプログラム

sub15_2.cpp
//画面表示
void display(cv::Mat image) {
    std::string windowName = "windowName";
    cv::namedWindow(windowName, CV_WINDOW_NORMAL/2);
    cv::imshow(windowName, image);
    cv::waitKey(0);
}

int sub15() {

    // 7×7の画像、1ch
    Mat img_src = cv::Mat::zeros(8, 8, CV_8UC1);
    Mat img_tmp;
    Mat img_dst;

    int cols = img_src.cols;
    int rows = img_src.rows;
    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < cols; i++) {

            if((2<=j && j<=5) && (2 <= i && i <= 5))
            {
                img_src.at<unsigned char>(j, i) = 255;
            }
            else
            {
                img_src.at<unsigned char>(j, i) = 0;
            }
        }
    }
    // Sobelオペレータ
    Sobel(img_src, img_tmp, CV_32F, 1, 0, 3);
    convertScaleAbs(img_tmp, img_dst, 1, 0);

    //画面に出力
    display(img_dst);
    return 0;
}

出力画像

分裂してしまった。。
グレースケール画像の変換はパス。

2

Q. 図7.7に鮮鋭化オペレータを適用すると、どのような画像が得られるか。

鮮鋭化オペレータ:画像のエッジを強調するオペレータ。入力画像に対して、ある平滑化処理を施し、その結果を元の画像から引くことで適用される。

出力画像

今度は膨らんだ。