Home | History | Annotate | Download | only in test
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                           License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Third party copyrights are property of their respective owners.
     16 //
     17 // Redistribution and use in source and binary forms, with or without modification,
     18 // are permitted provided that the following conditions are met:
     19 //
     20 //   * Redistribution's of source code must retain the above copyright notice,
     21 //     this list of conditions and the following disclaimer.
     22 //
     23 //   * Redistribution's in binary form must reproduce the above copyright notice,
     24 //     this list of conditions and the following disclaimer in the documentation
     25 //     and/or other materials provided with the distribution.
     26 //
     27 //   * The name of the copyright holders may not be used to endorse or promote products
     28 //     derived from this software without specific prior written permission.
     29 //
     30 // This software is provided by the copyright holders and contributors "as is" and
     31 // any express or implied warranties, including, but not limited to, the implied
     32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     33 // In no event shall the Intel Corporation or contributors be liable for any direct,
     34 // indirect, incidental, special, exemplary, or consequential damages
     35 // (including, but not limited to, procurement of substitute goods or services;
     36 // loss of use, data, or profits; or business interruption) however caused
     37 // and on any theory of liability, whether in contract, strict liability,
     38 // or tort (including negligence or otherwise) arising in any way out of
     39 // the use of this software, even if advised of the possibility of such damage.
     40 //
     41 //M*/
     42 
     43 #include "test_precomp.hpp"
     44 #include "opencv2/photo.hpp"
     45 #include <string>
     46 
     47 using namespace cv;
     48 using namespace std;
     49 
     50 //#define DUMP_RESULTS
     51 
     52 #ifdef DUMP_RESULTS
     53 #  define DUMP(image, path) imwrite(path, image)
     54 #else
     55 #  define DUMP(image, path)
     56 #endif
     57 
     58 
     59 TEST(Photo_DenoisingGrayscale, regression)
     60 {
     61     string folder = string(cvtest::TS::ptr()->get_data_path()) + "denoising/";
     62     string original_path = folder + "lena_noised_gaussian_sigma=10.png";
     63     string expected_path = folder + "lena_noised_denoised_grayscale_tw=7_sw=21_h=10.png";
     64 
     65     Mat original = imread(original_path, IMREAD_GRAYSCALE);
     66     Mat expected = imread(expected_path, IMREAD_GRAYSCALE);
     67 
     68     ASSERT_FALSE(original.empty()) << "Could not load input image " << original_path;
     69     ASSERT_FALSE(expected.empty()) << "Could not load reference image " << expected_path;
     70 
     71     Mat result;
     72     fastNlMeansDenoising(original, result, 10);
     73 
     74     DUMP(result, expected_path + ".res.png");
     75 
     76     ASSERT_EQ(0, cvtest::norm(result, expected, NORM_L2));
     77 }
     78 
     79 TEST(Photo_DenoisingColored, regression)
     80 {
     81     string folder = string(cvtest::TS::ptr()->get_data_path()) + "denoising/";
     82     string original_path = folder + "lena_noised_gaussian_sigma=10.png";
     83     string expected_path = folder + "lena_noised_denoised_lab12_tw=7_sw=21_h=10_h2=10.png";
     84 
     85     Mat original = imread(original_path, IMREAD_COLOR);
     86     Mat expected = imread(expected_path, IMREAD_COLOR);
     87 
     88     ASSERT_FALSE(original.empty()) << "Could not load input image " << original_path;
     89     ASSERT_FALSE(expected.empty()) << "Could not load reference image " << expected_path;
     90 
     91     Mat result;
     92     fastNlMeansDenoisingColored(original, result, 10, 10);
     93 
     94     DUMP(result, expected_path + ".res.png");
     95 
     96     ASSERT_EQ(0, cvtest::norm(result, expected, NORM_L2));
     97 }
     98 
     99 TEST(Photo_DenoisingGrayscaleMulti, regression)
    100 {
    101     const int imgs_count = 3;
    102     string folder = string(cvtest::TS::ptr()->get_data_path()) + "denoising/";
    103 
    104     string expected_path = folder + "lena_noised_denoised_multi_tw=7_sw=21_h=15.png";
    105     Mat expected = imread(expected_path, IMREAD_GRAYSCALE);
    106     ASSERT_FALSE(expected.empty()) << "Could not load reference image " << expected_path;
    107 
    108     vector<Mat> original(imgs_count);
    109     for (int i = 0; i < imgs_count; i++)
    110     {
    111         string original_path = format("%slena_noised_gaussian_sigma=20_multi_%d.png", folder.c_str(), i);
    112         original[i] = imread(original_path, IMREAD_GRAYSCALE);
    113         ASSERT_FALSE(original[i].empty()) << "Could not load input image " << original_path;
    114     }
    115 
    116     Mat result;
    117     fastNlMeansDenoisingMulti(original, result, imgs_count / 2, imgs_count, 15);
    118 
    119     DUMP(result, expected_path + ".res.png");
    120 
    121     ASSERT_EQ(0, cvtest::norm(result, expected, NORM_L2));
    122 }
    123 
    124 TEST(Photo_DenoisingColoredMulti, regression)
    125 {
    126     const int imgs_count = 3;
    127     string folder = string(cvtest::TS::ptr()->get_data_path()) + "denoising/";
    128 
    129     string expected_path = folder + "lena_noised_denoised_multi_lab12_tw=7_sw=21_h=10_h2=15.png";
    130     Mat expected = imread(expected_path, IMREAD_COLOR);
    131     ASSERT_FALSE(expected.empty()) << "Could not load reference image " << expected_path;
    132 
    133     vector<Mat> original(imgs_count);
    134     for (int i = 0; i < imgs_count; i++)
    135     {
    136         string original_path = format("%slena_noised_gaussian_sigma=20_multi_%d.png", folder.c_str(), i);
    137         original[i] = imread(original_path, IMREAD_COLOR);
    138         ASSERT_FALSE(original[i].empty()) << "Could not load input image " << original_path;
    139     }
    140 
    141     Mat result;
    142     fastNlMeansDenoisingColoredMulti(original, result, imgs_count / 2, imgs_count, 10, 15);
    143 
    144     DUMP(result, expected_path + ".res.png");
    145 
    146     ASSERT_EQ(0, cvtest::norm(result, expected, NORM_L2));
    147 }
    148 
    149 TEST(Photo_White, issue_2646)
    150 {
    151     cv::Mat img(50, 50, CV_8UC1, cv::Scalar::all(255));
    152     cv::Mat filtered;
    153     cv::fastNlMeansDenoising(img, filtered);
    154 
    155     int nonWhitePixelsCount = (int)img.total() - cv::countNonZero(filtered == img);
    156 
    157     ASSERT_EQ(0, nonWhitePixelsCount);
    158 }
    159 
    160 TEST(Photo_Denoising, speed)
    161 {
    162     string imgname = string(cvtest::TS::ptr()->get_data_path()) + "shared/5MP.png";
    163     Mat src = imread(imgname, 0), dst;
    164 
    165     double t = (double)getTickCount();
    166     fastNlMeansDenoising(src, dst, 5, 7, 21);
    167     t = (double)getTickCount() - t;
    168     printf("execution time: %gms\n", t*1000./getTickFrequency());
    169 }
    170