dct_image_denoising.cpp 1.71 KB
Newer Older
Bellaktris's avatar
Bellaktris committed
1
#include "opencv2/xphoto.hpp"
2 3 4 5 6 7 8 9 10 11 12

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc/types_c.h"

const char* keys =
{
    "{i || input image name}"
    "{o || output image name}"
Bellaktris's avatar
Bellaktris committed
13 14
    "{sigma || expected noise standard deviation}"
    "{psize |16| expected noise standard deviation}"
15 16 17 18 19 20 21 22 23 24
};

int main( int argc, const char** argv )
{
    bool printHelp = ( argc == 1 );
    printHelp = printHelp || ( argc == 2 && std::string(argv[1]) == "--help" );
    printHelp = printHelp || ( argc == 2 && std::string(argv[1]) == "-h" );

    if ( printHelp )
    {
Bellaktris's avatar
Bellaktris committed
25
        printf("\nThis sample demonstrates dct-based image denoising\n"
26
            "Call:\n"
Bellaktris's avatar
Bellaktris committed
27
            "    dct_image_denoising -i=<string> -sigma=<double> -psize=<int> [-o=<string>]\n\n");
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
        return 0;
    }

    cv::CommandLineParser parser(argc, argv, keys);
    if ( !parser.check() )
    {
        parser.printErrors();
        return -1;
    }

    std::string inFilename = parser.get<std::string>("i");
    std::string outFilename = parser.get<std::string>("o");

    cv::Mat src = cv::imread(inFilename, 1);
    if ( src.empty() )
    {
        printf("Cannot read image file: %s\n", inFilename.c_str());
        return -1;
    }

Bellaktris's avatar
Bellaktris committed
48 49 50 51 52 53 54 55
	double sigma = parser.get<double>("sigma");
	if (sigma == 0.0)
		sigma = 15.0;

    int psize = parser.get<int>("psize");
    if (psize == 0)
        psize = 16;

56
    cv::Mat res(src.size(), src.type());
57
    cv::xphoto::dctDenoising(src, res, sigma, psize);
58 59 60

    if ( outFilename == "" )
    {
Bellaktris's avatar
Bellaktris committed
61 62
        cv::namedWindow("denoising result", 1);
        cv::imshow("denoising result", res);
63 64 65 66 67 68 69 70

        cv::waitKey(0);
    }
    else
        cv::imwrite(outFilename, res);

    return 0;
}