Home | History | Annotate | Download | only in src
      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) 2013, OpenCV Foundation, all rights reserved.
     14 // Third party copyrights are property of their respective owners.
     15 //
     16 // Redistribution and use in source and binary forms, with or without modification,
     17 // are permitted provided that the following conditions are met:
     18 //
     19 //   * Redistribution's of source code must retain the above copyright notice,
     20 //     this list of conditions and the following disclaimer.
     21 //
     22 //   * Redistribution's in binary form must reproduce the above copyright notice,
     23 //     this list of conditions and the following disclaimer in the documentation
     24 //     and/or other materials provided with the distribution.
     25 //
     26 //   * The name of the copyright holders may not be used to endorse or promote products
     27 //     derived from this software without specific prior written permission.
     28 //
     29 // This software is provided by the copyright holders and contributors "as is" and
     30 // any express or implied warranties, including, but not limited to, the implied
     31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     32 // In no event shall the Intel Corporation or contributors be liable for any direct,
     33 // indirect, incidental, special, exemplary, or consequential damages
     34 // (including, but not limited to, procurement of substitute goods or services;
     35 // loss of use, data, or profits; or business interruption) however caused
     36 // and on any theory of liability, whether in contract, strict liability,
     37 // or tort (including negligence or otherwise) arising in any way out of
     38 // the use of this software, even if advised of the possibility of such damage.
     39 //
     40 //M*/
     41 
     42 #include "precomp.hpp"
     43 #include "opencv2/photo.hpp"
     44 #include <iostream>
     45 #include <stdlib.h>
     46 
     47 #include "npr.hpp"
     48 
     49 using namespace std;
     50 using namespace cv;
     51 
     52 void cv::edgePreservingFilter(InputArray _src, OutputArray _dst, int flags, float sigma_s, float sigma_r)
     53 {
     54     Mat I = _src.getMat();
     55     _dst.create(I.size(), CV_8UC3);
     56     Mat dst = _dst.getMat();
     57 
     58     int h = I.size().height;
     59     int w = I.size().width;
     60 
     61     Mat res = Mat(h,w,CV_32FC3);
     62     dst.convertTo(res,CV_32FC3,1.0/255.0);
     63 
     64     Domain_Filter obj;
     65 
     66     Mat img = Mat(I.size(),CV_32FC3);
     67     I.convertTo(img,CV_32FC3,1.0/255.0);
     68 
     69     obj.filter(img, res, sigma_s, sigma_r, flags);
     70 
     71     convertScaleAbs(res, dst, 255,0);
     72 }
     73 
     74 void cv::detailEnhance(InputArray _src, OutputArray _dst, float sigma_s, float sigma_r)
     75 {
     76     Mat I = _src.getMat();
     77     _dst.create(I.size(), CV_8UC3);
     78     Mat dst = _dst.getMat();
     79 
     80     int h = I.size().height;
     81     int w = I.size().width;
     82     float factor = 3.0f;
     83 
     84     Mat img = Mat(I.size(),CV_32FC3);
     85     I.convertTo(img,CV_32FC3,1.0/255.0);
     86 
     87     Mat res = Mat(h,w,CV_32FC1);
     88     dst.convertTo(res,CV_32FC3,1.0/255.0);
     89 
     90     Mat result = Mat(img.size(),CV_32FC3);
     91     Mat lab = Mat(img.size(),CV_32FC3);
     92     vector <Mat> lab_channel;
     93 
     94     cvtColor(img,lab,COLOR_BGR2Lab);
     95     split(lab,lab_channel);
     96 
     97     Mat L = Mat(img.size(),CV_32FC1);
     98 
     99     lab_channel[0].convertTo(L,CV_32FC1,1.0/255.0);
    100 
    101     Domain_Filter obj;
    102 
    103     obj.filter(L, res, sigma_s, sigma_r, 1);
    104 
    105     Mat detail = Mat(h,w,CV_32FC1);
    106 
    107     detail = L - res;
    108     multiply(detail,factor,detail);
    109     L = res + detail;
    110 
    111     L.convertTo(lab_channel[0],CV_32FC1,255);
    112 
    113     merge(lab_channel,lab);
    114 
    115     cvtColor(lab,result,COLOR_Lab2BGR);
    116     result.convertTo(dst,CV_8UC3,255);
    117 }
    118 
    119 void cv::pencilSketch(InputArray _src, OutputArray _dst1, OutputArray _dst2, float sigma_s, float sigma_r, float shade_factor)
    120 {
    121     Mat I = _src.getMat();
    122     _dst1.create(I.size(), CV_8UC1);
    123     Mat dst1 = _dst1.getMat();
    124 
    125     _dst2.create(I.size(), CV_8UC3);
    126     Mat dst2 = _dst2.getMat();
    127 
    128     Mat img = Mat(I.size(),CV_32FC3);
    129     I.convertTo(img,CV_32FC3,1.0/255.0);
    130 
    131     Domain_Filter obj;
    132 
    133     Mat sketch = Mat(I.size(),CV_32FC1);
    134     Mat color_sketch = Mat(I.size(),CV_32FC3);
    135 
    136     obj.pencil_sketch(img, sketch, color_sketch, sigma_s, sigma_r, shade_factor);
    137 
    138     sketch.convertTo(dst1,CV_8UC1,255);
    139     color_sketch.convertTo(dst2,CV_8UC3,255);
    140 
    141 }
    142 
    143 void cv::stylization(InputArray _src, OutputArray _dst, float sigma_s, float sigma_r)
    144 {
    145     Mat I = _src.getMat();
    146     _dst.create(I.size(), CV_8UC3);
    147     Mat dst = _dst.getMat();
    148 
    149     Mat img = Mat(I.size(),CV_32FC3);
    150     I.convertTo(img,CV_32FC3,1.0/255.0);
    151 
    152     int h = img.size().height;
    153     int w = img.size().width;
    154 
    155     Mat res = Mat(h,w,CV_32FC3);
    156     Mat magnitude = Mat(h,w,CV_32FC1);
    157 
    158     Domain_Filter obj;
    159     obj.filter(img, res, sigma_s, sigma_r, NORMCONV_FILTER);
    160 
    161     obj.find_magnitude(res,magnitude);
    162 
    163     Mat stylized = Mat(h,w,CV_32FC3);
    164 
    165     vector <Mat> temp;
    166     split(res,temp);
    167     multiply(temp[0],magnitude,temp[0]);
    168     multiply(temp[1],magnitude,temp[1]);
    169     multiply(temp[2],magnitude,temp[2]);
    170     merge(temp,stylized);
    171 
    172     stylized.convertTo(dst,CV_8UC3,255);
    173 }
    174