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