OpenCVを使ってLenaさんをシャープにする。(0006)

Lenaさんをシャープにするには隣のピクセルの値を使う
まず描くピクセル値を5倍、それだと濃すぎるので上、下、右、左の
ピクセル値を5倍した値から引く、0-255の範囲を越えると強制的に0か255にする。 隣とくらべて明るいところはさらに明るく!! その反対は暗く!!
Lenaさん回りの1ピクセルは真っ黒です。

//画面をだすよ
void display(cv::Mat image) {
    //名前をつける
    std::string windowName = "windowName";
    cv::namedWindow(windowName);
    //画面位置固定
    cv::moveWindow(windowName, 100, 100);
    //画面出た!!
    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_8UC3);

    uchar ue[3];
    uchar shita[3];
    uchar hidari[3];
    uchar migi[3];
    for (int j = 1; j < rows - 1; j++) {
        for (int i = 1; i < cols - 1; i++) {
            for (int k = 0; k < 3; k++) {
                ue[k] = lena.at<cv::Vec3b>(j - 1, i)[k];
                shita[k] = lena.at<cv::Vec3b>(j + 1, i)[k];
                hidari[k] = lena.at<cv::Vec3b>(j, i - 1)[k];
                migi[k] = lena.at<cv::Vec3b>(j, i + 1)[k];

                image.at<cv::Vec3b>(j, i)[k] = cv::saturate_cast<uchar>(
                        lena.at<cv::Vec3b>(j, i)[k] * 5
                        - ue[k] - shita[k] - hidari[k] - migi[k]
                       );
            }
        }
    }

    //画面に出して!!
    display(image);

}

オリジナル

f:id:treehitsuji:20150125104314p:plain

シャープLenaさん (ノイズもシャープに!!)

f:id:treehitsuji:20150125121451p:plain