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
edgePreservingFilter(InputArray _src,OutputArray _dst,int flags,float sigma_s,float sigma_r)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
detailEnhance(InputArray _src,OutputArray _dst,float sigma_s,float sigma_r)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
pencilSketch(InputArray _src,OutputArray _dst1,OutputArray _dst2,float sigma_s,float sigma_r,float shade_factor)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
stylization(InputArray _src,OutputArray _dst,float sigma_s,float sigma_r)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