npr.cpp 5.15 KB
Newer Older
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 33 34 35 36 37 38 39 40 41
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                           License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of the copyright holders may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

42 43 44 45 46 47 48 49 50 51
#include "precomp.hpp"
#include "opencv2/photo.hpp"
#include <iostream>
#include <stdlib.h>

#include "npr.hpp"

using namespace std;
using namespace cv;

52
void cv::edgePreservingFilter(InputArray _src, OutputArray _dst, int flags, float sigma_s, float sigma_r)
53
{
54 55 56
    Mat I = _src.getMat();
    _dst.create(I.size(), CV_8UC3);
    Mat dst = _dst.getMat();
57

58 59
    int h = I.size().height;
    int w = I.size().width;
60

61 62
    Mat res = Mat(h,w,CV_32FC3);
    dst.convertTo(res,CV_32FC3,1.0/255.0);
63

64
    Domain_Filter obj;
65

66 67
    Mat img = Mat(I.size(),CV_32FC3);
    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 75

void cv::detailEnhance(InputArray _src, OutputArray _dst, float sigma_s, float sigma_r)
{
76 77 78
    Mat I = _src.getMat();
    _dst.create(I.size(), CV_8UC3);
    Mat dst = _dst.getMat();
79

80 81
    int h = I.size().height;
    int w = I.size().width;
Ilya Lavrenov's avatar
Ilya Lavrenov committed
82
    float factor = 3.0f;
83

84 85
    Mat img = Mat(I.size(),CV_32FC3);
    I.convertTo(img,CV_32FC3,1.0/255.0);
86

siddharth's avatar
siddharth committed
87
    Mat res = Mat(h,w,CV_32FC1);
88
    dst.convertTo(res,CV_32FC3,1.0/255.0);
89

90 91
    Mat result = Mat(img.size(),CV_32FC3);
    Mat lab = Mat(img.size(),CV_32FC3);
siddharth's avatar
siddharth committed
92
    vector <Mat> lab_channel;
93

94
    cvtColor(img,lab,COLOR_BGR2Lab);
siddharth's avatar
siddharth committed
95
    split(lab,lab_channel);
96

97
    Mat L = Mat(img.size(),CV_32FC1);
98

siddharth's avatar
siddharth committed
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

siddharth's avatar
siddharth committed
107 108 109
    detail = L - res;
    multiply(detail,factor,detail);
    L = res + detail;
110

siddharth's avatar
siddharth committed
111
    L.convertTo(lab_channel[0],CV_32FC1,255);
112

siddharth's avatar
siddharth committed
113
    merge(lab_channel,lab);
114 115 116

    cvtColor(lab,result,COLOR_Lab2BGR);
    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 122 123 124 125 126
    Mat I = _src.getMat();
    _dst1.create(I.size(), CV_8UC1);
    Mat dst1 = _dst1.getMat();

    _dst2.create(I.size(), CV_8UC3);
    Mat dst2 = _dst2.getMat();
127

128 129
    Mat img = Mat(I.size(),CV_32FC3);
    I.convertTo(img,CV_32FC3,1.0/255.0);
130

131
    Domain_Filter obj;
132

133 134
    Mat sketch = Mat(I.size(),CV_32FC1);
    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 139
    sketch.convertTo(dst1,CV_8UC1,255);
    color_sketch.convertTo(dst2,CV_8UC3,255);
140 141 142 143 144

}

void cv::stylization(InputArray _src, OutputArray _dst, float sigma_s, float sigma_r)
{
145 146 147
    Mat I = _src.getMat();
    _dst.create(I.size(), CV_8UC3);
    Mat dst = _dst.getMat();
148

149 150
    Mat img = Mat(I.size(),CV_32FC3);
    I.convertTo(img,CV_32FC3,1.0/255.0);
151

152 153
    int h = img.size().height;
    int w = img.size().width;
154

155
    Mat res = Mat(h,w,CV_32FC3);
siddharth's avatar
siddharth committed
156
    Mat magnitude = Mat(h,w,CV_32FC1);
157

158 159
    Domain_Filter obj;
    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

siddharth's avatar
siddharth committed
165 166 167 168 169 170
    vector <Mat> temp;
    split(res,temp);
    multiply(temp[0],magnitude,temp[0]);
    multiply(temp[1],magnitude,temp[1]);
    multiply(temp[2],magnitude,temp[2]);
    merge(temp,stylized);
171

172
    stylized.convertTo(dst,CV_8UC3,255);
173
}