コンテンツにスキップ

Top

OpenCVで画像をシャープにする

なんか、OpenCVでぼけた画像をシャープにしようと思ったんだけど、そのものずばりな関数がなかったので調べた結果をのせる。

ぼやけさせて合成

まず、今あるボケ画像をGaussianBlurでぼやけさせた画像を作る(すでにぼけてんのにさらにぼけた画像作る発想好き)。

で、cv::addWeightedで元画像をちょっと強めに、ぼけた画像をちょっと弱めにして合成する。

するとなぜかシャープになる!理屈は知らん!!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, char** argv)
{
    if (argc < 2) {
        std::cout << "error" << std::endl;
        return -1;
    }

    cv::Mat inImg;
    cv::Mat blurImg;
    cv::Mat outImg;

    // 入力画像読み込み
    inImg = cv::imread(argv[1]);

    // いったんぼやけさせる(すでにぼけてるのにぼやけさせるのもあれだがノイズ除去に必要らしい)
    cv::GaussianBlur(inImg, blurImg, cv::Size(0, 0), 3, 3);

    // 元画像強め、ぼやけ画像弱めで合成
    double alpha = 1.5; // ここの数字が大きいとシャープ度が増すが大きすぎるとひどいことになる
    cv::addWeighted(inImg, alpha, blurImg, 1 - alpha, 0, outImg);

    // 結果
    cv::imshow("in", inImg);
    cv::imshow("blur", blurImg);
    cv::imshow("out", outImg);
    cv::waitKey();

    return 0;
}

■結果

元画像 シャープにした画像

以上!