├── .gitignore ├── LICENSE ├── OpenCV330_x64_Debug.props ├── OpenCV330_x64_Release.props ├── OpenCVImageProcessing.sln ├── README.md ├── dataset ├── flower.jpg ├── fog.jpg ├── girl.jpg ├── mountains.png └── trees.png └── src ├── 1.PSImageLayerBlend1 ├── 1.PSImageLayerBlend1.vcxproj ├── 1.PSImageLayerBlend1.vcxproj.filters └── main.cpp ├── 10.DarkChannelPriorHazeRemoval ├── 10.DarkChannelPriorHazeRemoval.vcxproj ├── 10.DarkChannelPriorHazeRemoval.vcxproj.filters └── main.cpp ├── 11.PSFilterGroudGlassEffects ├── 11.PSFilterGroudGlassEffects.vcxproj ├── 11.PSFilterGroudGlassEffects.vcxproj.filters └── main.cpp ├── 12.PSFilterOverExposure ├── 12.PSFilterOverExposure.vcxproj ├── 12.PSFilterOverExposure.vcxproj.filters └── main.cpp ├── 13.ColorComputation2 ├── 13.ColorComputation2.vcxproj ├── 13.ColorComputation2.vcxproj.filters └── main.cpp ├── 14.LitUpEdges ├── 14.LitUpEdges.vcxproj ├── 14.LitUpEdges.vcxproj.filters └── main.cpp ├── 15.PSFilterEmbossingEffects ├── 15.PSFilterEmbossingEffects.vcxproj ├── 15.PSFilterEmbossingEffects.vcxproj.filters └── main.cpp ├── 16.OldPhotoEffects ├── 16.OldPhotoEffects.vcxproj ├── 16.OldPhotoEffects.vcxproj.filters └── main.cpp ├── 17.PSFilterGradientMap ├── 17.PSFilterGradientMap.vcxproj ├── 17.PSFilterGradientMap.vcxproj.filters └── main.cpp ├── 18.ToneMapping ├── 18.ToneMapping.vcxproj ├── 18.ToneMapping.vcxproj.filters └── main.cpp ├── 19.PSFilterSketchEffects ├── 19.PSFilterSketchEffects.vcxproj ├── 19.PSFilterSketchEffects.vcxproj.filters └── main.cpp ├── 2.PSImageLayerBlend2 ├── 2.PSImageLayerBlend2.vcxproj ├── 2.PSImageLayerBlend2.vcxproj.filters └── main.cpp ├── 20.PSFilterMosaic ├── 20.PSFilterMosaic.vcxproj ├── 20.PSFilterMosaic.vcxproj.filters └── main.cpp ├── 21.PSFilterNolinearFilter ├── 21.PSFilterNolinearFilter.vcxproj ├── 21.PSFilterNolinearFilter.vcxproj.filters └── main.cpp ├── 22.PSImageEffectsWindowShutter ├── 22.PSImageEffectsWindowShutter.vcxproj ├── 22.PSImageEffectsWindowShutter.vcxproj.filters └── main.cpp ├── 23.AdjustSaturation ├── 23.AdjustSaturation.vcxproj ├── 23.AdjustSaturation.vcxproj.filters └── main.cpp ├── 24.AdjustBlackAndWhite ├── 24.AdjustBlackAndWhite.vcxproj ├── 24.AdjustBlackAndWhite.vcxproj.filters └── main.cpp ├── 25.ColorUniformGradient ├── 25.ColorUniformGradient.vcxproj ├── 25.ColorUniformGradient.vcxproj.filters └── main.cpp ├── 26.RadialBlur ├── 26.RadialBlur.vcxproj ├── 26.RadialBlur.vcxproj.filters └── main.cpp ├── 27.RotateBlur2 ├── 27.RotateBlur2.vcxproj ├── 27.RotateBlur2.vcxproj.filters └── main.cpp ├── 28.RotateBlur ├── 28.RotateBlur.vcxproj ├── 28.RotateBlur.vcxproj.filters └── main.cpp ├── 29.GaussianBlur ├── 29.GaussianBlur.vcxproj ├── 29.GaussianBlur.vcxproj.filters └── main.cpp ├── 3.PSImageLayerBlend3 ├── 3.PSImageLayerBlend3.vcxproj ├── 3.PSImageLayerBlend3.vcxproj.filters └── main.cpp ├── 30.Plane2PolarCoordinates ├── 30.Plane2PolarCoordinates.vcxproj ├── 30.Plane2PolarCoordinates.vcxproj.filters └── main.cpp ├── 4.PSImageLayerBlend4 ├── 4.PSImageLayerBlend4.vcxproj ├── 4.PSImageLayerBlend4.vcxproj.filters └── main.cpp ├── 5.PSImageLayerBlend6 ├── 5.PSImageLayerBlend6.vcxproj ├── 5.PSImageLayerBlend6.vcxproj.filters └── main.cpp ├── 6.RGB2Gray ├── 6.RGB2Gray.vcxproj ├── 6.RGB2Gray.vcxproj.filters └── main.cpp ├── 7.RGBSplit ├── 7.RGBSplit.vcxproj ├── 7.RGBSplit.vcxproj.filters └── main.cpp ├── 8.ColorComputation ├── 8.ColorComputation.vcxproj ├── 8.ColorComputation.vcxproj.filters └── main.cpp └── 9.PSFilterDebrisEffects ├── 9.PSFilterDebrisEffects.vcxproj ├── 9.PSFilterDebrisEffects.vcxproj.filters └── main.cpp /OpenCV330_x64_Debug.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | F:\compiled_code\opencv-3.3.0\build\install\include;%(AdditionalIncludeDirectories) 9 | 10 | 11 | F:\compiled_code\opencv-3.3.0\build\install\x64\vc15\lib;%(AdditionalLibraryDirectories) 12 | opencv_core330d.lib;opencv_highgui330d.lib;opencv_imgcodecs330d.lib;opencv_imgproc330d.lib;opencv_optflow330d.lib;%(AdditionalDependencies) 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /OpenCV330_x64_Release.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | F:\compiled_code\opencv-3.3.0\build\install\include;%(AdditionalIncludeDirectories) 9 | 10 | 11 | F:\compiled_code\opencv-3.3.0\build\install\x64\vc15\lib;%(AdditionalLibraryDirectories) 12 | opencv_core330.lib;opencv_highgui330.lib;opencv_imgcodecs330.lib;opencv_imgproc330.lib;opencv_optflow330.lib;%(AdditionalDependencies) 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 一、简介 2 | 3 | 实现CSDN专栏:[OpenCV图像处理](http://blog.csdn.net/column/details/opencv-image.html?&page=3)所介绍的所有算法。 4 | 5 | 当前已实现(30/50): 6 | 1. PS图层混合算法(一):不透明度、正片叠底、颜色加深、颜色减淡; 7 | 2. PS图层混合算法(二):线性加深、线性减淡、变亮、变暗; 8 | 3. PS图层混合算法(三):滤色、叠加、柔光、强光; 9 | 4. PS图层混合算法(四):亮光、点光、线性光、实色混合; 10 | 5. PS图层混合算法(六):差值、溶解、排除; 11 | 6. 彩色图像转灰度图像; 12 | 7. RGB三通道分离; 13 | 8. 颜色运算; 14 | 9. PS滤镜:碎片特效; 15 | 10. 暗通道先验去雾(待实现); 16 | 11. PS滤镜:毛玻璃特效; 17 | 12. PS滤镜:曝光过度; 18 | 13. 颜色运算(二); 19 | 14. 照亮边缘; 20 | 15. PS滤镜:浮雕特效; 21 | 16. 老照片效果; 22 | 17. PS滤镜:渐变映射; 23 | 18. 色调映射; 24 | 19. PS滤镜:素描特效; 25 | 20. PS滤镜:马赛克; 26 | 21. PS图像特效:非线性滤波器; 27 | 22. PS图像特效:百叶窗; 28 | 23. 饱和度调整; 29 | 24. 黑白调整; 30 | 25. 生成关于某点的颜色径向均匀渐变图像; 31 | 26. 径向模糊; 32 | 27. 旋转模糊(二); 33 | 28. 旋转模糊; 34 | 29. 高斯模糊与毛玻璃特效; 35 | 30. PS滤镜算法之平面坐标到极坐标的变换; 36 | 37 | # 二、开发环境 38 | 39 | Win10 + Visual Studio Community 2017 + OpenCV 3.3.0(64位) 40 | 41 | # 三、编译方法 42 | 43 | 1. 使用Visual Studio 2017打开“OpenCVImageProcessing.sln”; 44 | 2. 打开“视图->其他窗口->属性管理器”; 45 | 3. 任选一项目,在“OpenCV330_x64_Debug”上右击,然后点击“属性”; 46 | 4. 然后分别在“C/C++->常规->附加包含目录”和“链接器->常规->附加库目录”中添加你自己的OpenCV头文件目录和库目录; 47 | 5. 任选一项目,在“OpenCV330_x64_Release”上右击,然后点击“属性”; 48 | 6. 然后分别在“C/C++->常规->附加包含目录”和“链接器->常规->附加库目录”中添加你自己的OpenCV头文件目录和库目录; 49 | 7. 回到Visual Studio 2017主界面,更改解决方案平台为“x64”; 50 | 8. 点击“生成->生成解决方案”。 -------------------------------------------------------------------------------- /dataset/flower.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzwm/OpenCVImageProcessing/192c6c62acb0c03f606f7d468276a5f1d78925eb/dataset/flower.jpg -------------------------------------------------------------------------------- /dataset/fog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzwm/OpenCVImageProcessing/192c6c62acb0c03f606f7d468276a5f1d78925eb/dataset/fog.jpg -------------------------------------------------------------------------------- /dataset/girl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzwm/OpenCVImageProcessing/192c6c62acb0c03f606f7d468276a5f1d78925eb/dataset/girl.jpg -------------------------------------------------------------------------------- /dataset/mountains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzwm/OpenCVImageProcessing/192c6c62acb0c03f606f7d468276a5f1d78925eb/dataset/mountains.png -------------------------------------------------------------------------------- /dataset/trees.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzwm/OpenCVImageProcessing/192c6c62acb0c03f606f7d468276a5f1d78925eb/dataset/trees.png -------------------------------------------------------------------------------- /src/1.PSImageLayerBlend1/1.PSImageLayerBlend1.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {34B846AA-C729-4D42-A825-9486C72EE4D9} 24 | My1PSImageLayerBlend1 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/1.PSImageLayerBlend1/1.PSImageLayerBlend1.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/1.PSImageLayerBlend1/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/22416241 2 | // http://blog.csdn.net/matrix_space/article/details/37696015 3 | // PS图层混合算法(一):不透明度、正片叠底、颜色加深、颜色减淡 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 不透明度 9 | void transparent(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst, float alpha) 10 | { 11 | CV_Assert(src1.size() == src2.size()); 12 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 13 | CV_Assert(alpha >= 0.0f && alpha <= 1.0f); 14 | 15 | dst = alpha * src1 + (1.0f - alpha) * src2; 16 | } 17 | 18 | // 正片叠底 19 | void multiply(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 20 | { 21 | CV_Assert(src1.size() == src2.size()); 22 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 23 | 24 | cv::multiply(src1, src2, dst); 25 | } 26 | 27 | // 颜色加深 28 | void color_burn(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 29 | { 30 | CV_Assert(src1.size() == src2.size()); 31 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 32 | 33 | dst.create(src1.size(), src1.type()); 34 | const float threshold = 1e-6f; 35 | 36 | const int h = src1.rows; 37 | const int w = src2.cols; 38 | for (int y = 0; y < h; ++y) 39 | { 40 | cv::Vec3f* dstData = dst.ptr(y); 41 | const cv::Vec3f* src1Data = src1.ptr(y); 42 | const cv::Vec3f* src2Data = src2.ptr(y); 43 | for (int x = 0; x < w; ++x) 44 | { 45 | cv::Vec3f& d = dstData[x]; 46 | const cv::Vec3f& s1 = src1Data[x]; 47 | const cv::Vec3f& s2 = src2Data[x]; 48 | for (int i = 0; i < 3; ++i) 49 | { 50 | if (s1[i] > threshold) 51 | { 52 | d[i] = 1.0f - (1.0f - s2[i]) / s1[i]; 53 | d[i] = std::max(d[i], 0.0f); 54 | } 55 | else 56 | { 57 | d[i] = 0.0f; 58 | } 59 | } 60 | } 61 | } 62 | } 63 | 64 | // 颜色减淡 65 | void color_dodge(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 66 | { 67 | CV_Assert(src1.size() == src2.size()); 68 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 69 | 70 | dst.create(src1.size(), src1.type()); 71 | const float threshold = 1.0f - 1e-6f; 72 | 73 | const int h = src1.rows; 74 | const int w = src2.cols; 75 | for (int y = 0; y < h; ++y) 76 | { 77 | cv::Vec3f* dstData = dst.ptr(y); 78 | const cv::Vec3f* src1Data = src1.ptr(y); 79 | const cv::Vec3f* src2Data = src2.ptr(y); 80 | for (int x = 0; x < w; ++x) 81 | { 82 | cv::Vec3f& d = dstData[x]; 83 | const cv::Vec3f& s1 = src1Data[x]; 84 | const cv::Vec3f& s2 = src2Data[x]; 85 | for (int i = 0; i < 3; ++i) 86 | { 87 | if (s1[i] < threshold) 88 | { 89 | d[i] = s2[i] / (1.0f - s1[i]); 90 | d[i] = std::min(d[i], 1.0f); 91 | } 92 | else 93 | { 94 | d[i] = 1.0f; 95 | } 96 | } 97 | } 98 | } 99 | } 100 | 101 | int main() 102 | { 103 | cv::Mat imageUp = cv::imread("../../dataset/trees.png"); 104 | cv::Mat imageDown = cv::imread("../../dataset/mountains.png"); 105 | if (imageUp.empty() || imageDown.empty() 106 | || imageUp.size() != imageDown.size()) 107 | { 108 | return -1; 109 | } 110 | 111 | cv::imshow("Original up image", imageUp); 112 | cv::imshow("Original down image", imageDown); 113 | 114 | imageUp.convertTo(imageUp, CV_32FC3, 1.0 / 255.0); 115 | imageDown.convertTo(imageDown, CV_32FC3, 1.0 / 255.0); 116 | 117 | cv::Mat transparentImage; 118 | transparent(imageUp, imageDown, transparentImage, 0.5f); 119 | transparentImage.convertTo(transparentImage, CV_8UC3, 255.0); 120 | cv::imshow("Transparent image", transparentImage); 121 | 122 | cv::Mat multiplyImage; 123 | multiply(imageUp, imageDown, multiplyImage); 124 | multiplyImage.convertTo(multiplyImage, CV_8UC3, 255.0); 125 | cv::imshow("Multiply image", multiplyImage); 126 | 127 | cv::Mat colorBurnImage; 128 | color_burn(imageUp, imageDown, colorBurnImage); 129 | colorBurnImage.convertTo(colorBurnImage, CV_8UC3, 255.0); 130 | cv::imshow("Color burn image", colorBurnImage); 131 | 132 | cv::Mat colorDodgeImage; 133 | color_dodge(imageUp, imageDown, colorDodgeImage); 134 | colorDodgeImage.convertTo(colorDodgeImage, CV_8UC3, 255.0); 135 | cv::imshow("Color dodge image", colorDodgeImage); 136 | 137 | cv::waitKey(); 138 | return 0; 139 | } 140 | -------------------------------------------------------------------------------- /src/10.DarkChannelPriorHazeRemoval/10.DarkChannelPriorHazeRemoval.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/10.DarkChannelPriorHazeRemoval/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40652883 2 | // 暗通道先验去雾 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | int main() 8 | { 9 | // TODO 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /src/11.PSFilterGroudGlassEffects/11.PSFilterGroudGlassEffects.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/11.PSFilterGroudGlassEffects/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40271843 2 | // PS滤镜:毛玻璃特效 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | // 毛玻璃特效 8 | void ground_glass_effects(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | dst.create(src.size(), src.type()); 13 | 14 | cv::Mat blur; 15 | cv::GaussianBlur(src, blur, cv::Size(5, 5), 0.0); 16 | 17 | const int P_size = 3; 18 | const int h = src.rows; 19 | const int w = src.cols; 20 | 21 | srand((unsigned int)cv::getTickCount()); 22 | 23 | for (int y = P_size; y < h - P_size; ++y) 24 | { 25 | for (int x = P_size; x < w - P_size; ++x) 26 | { 27 | float k1 = (rand() % 100) / 100.0f - 0.5f; 28 | float k2 = (rand() % 100) / 100.0f - 0.5f; 29 | 30 | float m = k1 * (P_size * 2 - 1); 31 | float n = k2 * (P_size * 2 - 1); 32 | 33 | int row = static_cast(y + m) % h; 34 | int col = static_cast(x + n) % w; 35 | 36 | dst.at(y, x) = blur.at(row, col); 37 | } 38 | } 39 | } 40 | 41 | // 毛玻璃特效-无黑边 42 | void ground_glass_effects_no_border(const cv::Mat& src, cv::Mat& dst) 43 | { 44 | CV_Assert(src.type() == CV_32FC3); 45 | 46 | dst.create(src.size(), src.type()); 47 | 48 | const int P_size = 3; 49 | 50 | cv::Mat extend; 51 | cv::copyMakeBorder(src, extend, P_size, P_size, P_size, P_size, cv::BORDER_DEFAULT); 52 | 53 | cv::Mat blur; 54 | cv::GaussianBlur(extend, blur, cv::Size(5, 5), 0.0); 55 | 56 | const int h = src.rows; 57 | const int w = src.cols; 58 | const int eh = extend.rows; 59 | const int ew = extend.cols; 60 | 61 | srand((unsigned int)cv::getTickCount()); 62 | 63 | for (int y = 0; y < h; ++y) 64 | { 65 | for (int x = 0; x < w; ++x) 66 | { 67 | float k1 = (rand() % 100) / 100.0f - 0.5f; 68 | float k2 = (rand() % 100) / 100.0f - 0.5f; 69 | 70 | float m = k1 * (P_size * 2 - 1); 71 | float n = k2 * (P_size * 2 - 1); 72 | 73 | int row = static_cast(y + m) % eh; 74 | int col = static_cast(x + n) % ew; 75 | 76 | dst.at(y, x) = blur.at(row + P_size, col + P_size); 77 | } 78 | } 79 | } 80 | 81 | int main() 82 | { 83 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 84 | if (colorImage.empty()) 85 | { 86 | return -1; 87 | } 88 | 89 | cv::imshow("Color image", colorImage); 90 | 91 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 92 | 93 | cv::Mat resultImage; 94 | ground_glass_effects(colorImage, resultImage); 95 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 96 | cv::imshow("Result image", resultImage); 97 | 98 | cv::Mat noBorderImage; 99 | ground_glass_effects_no_border(colorImage, noBorderImage); 100 | noBorderImage.convertTo(noBorderImage, CV_8UC3, 255.0); 101 | cv::imshow("Result no border image", noBorderImage); 102 | 103 | cv::waitKey(); 104 | return 0; 105 | } 106 | -------------------------------------------------------------------------------- /src/12.PSFilterOverExposure/12.PSFilterOverExposure.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {632BF248-EBC2-4BF9-A906-3F4F40C4CA29} 24 | My12PSFilterOverExposure 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/12.PSFilterOverExposure/12.PSFilterOverExposure.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/12.PSFilterOverExposure/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/30470303 2 | // http://blog.csdn.net/matrix_space/article/details/40402141 3 | // PS滤镜:曝光过度特效 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 曝光过度特效 9 | void over_exposure(const cv::Mat& src, cv::Mat& dst) 10 | { 11 | CV_Assert(src.type() == CV_32FC3); 12 | 13 | cv::Mat inverse = cv::Scalar(1.0f, 1.0f, 1.0f) - src; 14 | // 或使用下面的两句代码,效果一样 15 | //cv::Mat inverse; 16 | //cv::subtract(1.0f, src, inverse); 17 | 18 | cv::min(src, inverse, dst); 19 | } 20 | 21 | int main() 22 | { 23 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 24 | if (colorImage.empty()) 25 | { 26 | return -1; 27 | } 28 | 29 | cv::imshow("Color image", colorImage); 30 | 31 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 32 | 33 | cv::Mat resultImage; 34 | over_exposure(colorImage, resultImage); 35 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 36 | cv::imshow("Result image", resultImage); 37 | 38 | cv::waitKey(); 39 | return 0; 40 | } 41 | -------------------------------------------------------------------------------- /src/13.ColorComputation2/13.ColorComputation2.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {7D7BE151-391D-4D87-B470-1C65B8A799BA} 24 | My13ColorComputation2 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/13.ColorComputation2/13.ColorComputation2.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/13.ColorComputation2/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40402373 2 | // 颜色运算(二) 3 | #include 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void color_computation(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | std::vector vecBGR; 13 | cv::split(src, vecBGR); 14 | cv::Mat B = vecBGR[0]; 15 | cv::Mat G = vecBGR[1]; 16 | cv::Mat R = vecBGR[2]; 17 | 18 | cv::Mat resultB; 19 | cv::Mat resultG; 20 | cv::Mat resultR; 21 | 22 | cv::pow(R - G, 2.0, resultB); 23 | cv::pow(R - B, 2.0, resultG); 24 | cv::pow(G - B, 2.0, resultR); 25 | 26 | resultB = resultB / 128.0f; 27 | resultG = resultG / 128.0f; 28 | resultR = resultR / 128.0f; 29 | 30 | std::vector vecResultBGR; 31 | vecResultBGR.push_back(resultB); 32 | vecResultBGR.push_back(resultG); 33 | vecResultBGR.push_back(resultR); 34 | cv::merge(vecResultBGR, dst); 35 | } 36 | 37 | int main() 38 | { 39 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 40 | if (colorImage.empty()) 41 | { 42 | return -1; 43 | } 44 | 45 | cv::imshow("Color image", colorImage); 46 | 47 | colorImage.convertTo(colorImage, CV_32FC3); 48 | 49 | cv::Mat resultImage; 50 | color_computation(colorImage, resultImage); 51 | resultImage.convertTo(resultImage, CV_8UC3); 52 | cv::imshow("Result image", resultImage); 53 | 54 | cv::waitKey(); 55 | return 0; 56 | } 57 | -------------------------------------------------------------------------------- /src/14.LitUpEdges/14.LitUpEdges.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {B2ECF6DE-EBFB-4E88-8E71-A199F5774D88} 24 | My14LitUpEdges 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/14.LitUpEdges/14.LitUpEdges.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/14.LitUpEdges/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/30283003 2 | // http://blog.csdn.net/matrix_space/article/details/40403411 3 | // PS滤镜算法原理——照亮边缘 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 照亮边缘 9 | void lit_up_edges(const cv::Mat& src, cv::Mat& dst) 10 | { 11 | CV_Assert(src.type() == CV_32FC3); 12 | 13 | const int kernelSize = 3; 14 | const int p = 3; 15 | const int q = 0; 16 | 17 | const int gx[] = 18 | { 19 | -1, -p, -1, 20 | 0, q, 0, 21 | 1, p, 1 22 | }; 23 | const int gy[] = 24 | { 25 | -1, 0, 1, 26 | -p, q, p, 27 | -1, 0, 1 28 | }; 29 | 30 | cv::Mat gxMat(cv::Size(kernelSize, kernelSize), CV_32SC1, (void*)gx); 31 | cv::Mat gyMat(cv::Size(kernelSize, kernelSize), CV_32SC1, (void*)gy); 32 | 33 | cv::Mat imageX; 34 | cv::Mat imageY; 35 | cv::filter2D(src, imageX, -1, gxMat); 36 | cv::filter2D(src, imageY, -1, gyMat); 37 | 38 | const float alpha = 0.5f; 39 | 40 | dst = alpha * cv::abs(imageX) + (1.0f - alpha) * cv::abs(imageY); 41 | } 42 | 43 | int main() 44 | { 45 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 46 | if (colorImage.empty()) 47 | { 48 | return -1; 49 | } 50 | 51 | cv::imshow("Color image", colorImage); 52 | 53 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 54 | 55 | cv::Mat resultImage; 56 | lit_up_edges(colorImage, resultImage); 57 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 58 | cv::imshow("Result image", resultImage); 59 | 60 | cv::waitKey(); 61 | return 0; 62 | } 63 | -------------------------------------------------------------------------------- /src/15.PSFilterEmbossingEffects/15.PSFilterEmbossingEffects.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/15.PSFilterEmbossingEffects/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/29193433 2 | // http://blog.csdn.net/matrix_space/article/details/40431061 3 | // PS滤镜:浮雕特效 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void embossing_effects(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | const int p = 3; 13 | const int kernel[] = 14 | { 15 | 0, 0, -p, // 注意此处与原文的不同 16 | 0, 0, 0, 17 | p, 0, 0 18 | }; 19 | cv::Mat kernelMat(cv::Size(3, 3), CV_32SC1, (void*)kernel); 20 | 21 | cv::filter2D(src, dst, -1, kernelMat); 22 | cv::add(dst, cv::Scalar(128.0, 128.0, 128.0), dst); 23 | } 24 | 25 | int main() 26 | { 27 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 28 | if (colorImage.empty()) 29 | { 30 | return -1; 31 | } 32 | 33 | cv::imshow("Color image", colorImage); 34 | 35 | colorImage.convertTo(colorImage, CV_32FC3); 36 | 37 | cv::Mat resultImage; 38 | embossing_effects(colorImage, resultImage); 39 | resultImage.convertTo(resultImage, CV_8UC3); 40 | cv::imshow("Result image", resultImage); 41 | 42 | cv::waitKey(); 43 | return 0; 44 | } 45 | -------------------------------------------------------------------------------- /src/16.OldPhotoEffects/16.OldPhotoEffects.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {6CB1E2BC-8800-4ED1-9DBF-A7159F871D68} 24 | My16OldPhotoEffects 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/16.OldPhotoEffects/16.OldPhotoEffects.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/16.OldPhotoEffects/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40432125 2 | // 老照片效果 3 | #include 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void old_photo_effects(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | std::vector vecBGR; 13 | cv::split(src, vecBGR); 14 | cv::Mat B = vecBGR[0]; 15 | cv::Mat G = vecBGR[1]; 16 | cv::Mat R = vecBGR[2]; 17 | 18 | cv::Mat dstB = 0.272 * R + 0.523 * G + 0.132 * B; 19 | cv::Mat dstG = 0.349 * R + 0.686 * G + 0.168 * B; 20 | cv::Mat dstR = 0.393 * R + 0.769 * G + 0.189 * B; 21 | 22 | std::vector vecDstBGR; 23 | vecDstBGR.push_back(dstB); 24 | vecDstBGR.push_back(dstG); 25 | vecDstBGR.push_back(dstR); 26 | cv::merge(vecDstBGR, dst); 27 | } 28 | 29 | int main() 30 | { 31 | cv::Mat colorImage = cv::imread("../../dataset/girl.jpg"); 32 | if (colorImage.empty()) 33 | { 34 | return -1; 35 | } 36 | 37 | cv::imshow("Color image", colorImage); 38 | 39 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 40 | 41 | cv::Mat resultImage; 42 | old_photo_effects(colorImage, resultImage); 43 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 44 | cv::imshow("Result image", resultImage); 45 | 46 | cv::waitKey(); 47 | return 0; 48 | } 49 | -------------------------------------------------------------------------------- /src/17.PSFilterGradientMap/17.PSFilterGradientMap.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/17.PSFilterGradientMap/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40477439 2 | // PS滤镜:渐变映射 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | void gradient_mapping(const cv::Mat& src, cv::Mat& dst) 8 | { 9 | CV_Assert(src.type() == CV_32FC3); 10 | 11 | // build the mapping table 12 | cv::Mat map(src.size(), src.type()); 13 | const int h = src.rows; // 注意此处与原文的不同 14 | const float h2 = h / 2.0f; 15 | for (int i = 0; i < h; ++i) 16 | { 17 | float val = 1.0f - std::abs(i / h2 - 1.0f); 18 | map.row(i).setTo(cv::Scalar(val, val, val)); 19 | } 20 | 21 | cv::multiply(src, map, dst); 22 | } 23 | 24 | int main() 25 | { 26 | cv::Mat colorImage = cv::imread("../../dataset/girl.jpg"); 27 | if (colorImage.empty()) 28 | { 29 | return -1; 30 | } 31 | 32 | cv::imshow("Color image", colorImage); 33 | 34 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 35 | 36 | cv::Mat resultImage; 37 | gradient_mapping(colorImage, resultImage); 38 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 39 | cv::imshow("Result image", resultImage); 40 | 41 | cv::waitKey(); 42 | return 0; 43 | } 44 | -------------------------------------------------------------------------------- /src/18.ToneMapping/18.ToneMapping.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {025B4554-0840-4DA0-9580-1E0D9F4A556A} 24 | My18ToneMapping 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/18.ToneMapping/18.ToneMapping.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/18.ToneMapping/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40584537 2 | // 色调映射 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | void tone_mapping(const cv::Mat& src, cv::Mat& dst) 8 | { 9 | CV_Assert(src.type() == CV_32FC3); 10 | 11 | dst.create(src.size(), src.type()); 12 | 13 | const int size = src.rows * src.cols; 14 | const cv::Vec3f* data = src.ptr(0); 15 | cv::Vec3f* dstData = dst.ptr(0); 16 | for (int i = 0; i < size; ++i) 17 | { 18 | const cv::Vec3f& s = data[i]; 19 | cv::Vec3f& d = dstData[i]; 20 | double val = s[0] * 0.144 + s[1] * 0.587 + s[2] * 0.299; 21 | //val /= 255.0; // 注意这里与原文的不同 22 | d[0] = static_cast(3 * val); 23 | d[1] = static_cast(3 * val - 1.0); 24 | d[2] = static_cast(3 * val - 2.0); 25 | } 26 | } 27 | 28 | int main() 29 | { 30 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 31 | if (colorImage.empty()) 32 | { 33 | return -1; 34 | } 35 | 36 | cv::imshow("Color image", colorImage); 37 | 38 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 39 | 40 | cv::Mat resultImage; 41 | tone_mapping(colorImage, resultImage); 42 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 43 | cv::imshow("Result image", resultImage); 44 | 45 | cv::waitKey(); 46 | return 0; 47 | } 48 | -------------------------------------------------------------------------------- /src/19.PSFilterSketchEffects/19.PSFilterSketchEffects.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/19.PSFilterSketchEffects/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/38687427 2 | // http://blog.csdn.net/matrix_space/article/details/40589411 3 | // PS滤镜:素描特效 4 | #include 5 | #include "opencv2/core/core.hpp" 6 | #include "opencv2/highgui/highgui.hpp" 7 | #include "opencv2/imgproc/imgproc.hpp" 8 | 9 | void sketch_effects(const cv::Mat& src, cv::Mat& dst) 10 | { 11 | CV_Assert(src.type() == CV_32FC3); 12 | 13 | cv::Mat gray; 14 | cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); 15 | 16 | cv::Mat invert; 17 | cv::subtract(cv::Scalar(1.0), gray, invert); 18 | 19 | cv::Mat gauss; 20 | cv::GaussianBlur(invert, gauss, cv::Size(25, 25), 0.0); 21 | 22 | const float delta = 0.01f; 23 | gauss = -gauss + 1.0f + delta; 24 | 25 | cv::Mat temp; 26 | cv::divide(gray, gauss, temp); 27 | 28 | const float alpha = 0.75f; 29 | cv::Mat B; 30 | cv::Mat G; 31 | cv::Mat R; 32 | 33 | B = alpha * temp + (1.0f - alpha) * 105.0f / 255.0f; 34 | G = alpha * temp + (1.0f - alpha) * 205.0f / 255.0f; 35 | R = alpha * temp + (1.0f - alpha) * 200.0f / 255.0f; 36 | 37 | std::vector vecDstBGR; 38 | vecDstBGR.push_back(B); 39 | vecDstBGR.push_back(G); 40 | vecDstBGR.push_back(R); 41 | cv::merge(vecDstBGR, dst); 42 | } 43 | 44 | int main() 45 | { 46 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 47 | if (colorImage.empty()) 48 | { 49 | return -1; 50 | } 51 | 52 | cv::imshow("Color image", colorImage); 53 | 54 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255); 55 | 56 | cv::Mat resultImage; 57 | sketch_effects(colorImage, resultImage); 58 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 59 | cv::imshow("Result image", resultImage); 60 | 61 | cv::waitKey(); 62 | return 0; 63 | } 64 | -------------------------------------------------------------------------------- /src/2.PSImageLayerBlend2/2.PSImageLayerBlend2.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {BAD56B91-A2F8-4DBE-B215-8B60C2E73187} 24 | My2PSImageLayerBlend2 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/2.PSImageLayerBlend2/2.PSImageLayerBlend2.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/2.PSImageLayerBlend2/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/22425209 2 | // http://blog.csdn.net/matrix_space/article/details/37760609 3 | // PS图层混合算法(二):线性加深、线性减淡、变亮、变暗 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 线性加深 9 | void linear_burn(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 10 | { 11 | CV_Assert(src1.size() == src2.size()); 12 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 13 | 14 | dst.create(src1.size(), src1.type()); 15 | 16 | const int h = src1.rows; 17 | const int w = src1.cols; 18 | for (int y = 0; y < h; ++y) 19 | { 20 | cv::Vec3f* dstData = dst.ptr(y); 21 | const cv::Vec3f* src1Data = src1.ptr(y); 22 | const cv::Vec3f* src2Data = src2.ptr(y); 23 | for (int x = 0; x < w; ++x) 24 | { 25 | cv::Vec3f& d = dstData[x]; 26 | const cv::Vec3f& s1 = src1Data[x]; 27 | const cv::Vec3f& s2 = src2Data[x]; 28 | for (int i = 0; i < 3; ++i) 29 | { 30 | d[i] = s1[i] + s2[i] - 1.0f; 31 | d[i] = std::max(d[i], 0.0f); 32 | } 33 | } 34 | } 35 | } 36 | 37 | // 线性减淡 38 | void linear_dodge(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 39 | { 40 | CV_Assert(src1.size() == src2.size()); 41 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 42 | 43 | dst.create(src1.size(), src1.type()); 44 | 45 | const int h = src1.rows; 46 | const int w = src1.cols; 47 | for (int y = 0; y < h; ++y) 48 | { 49 | cv::Vec3f* dstData = dst.ptr(y); 50 | const cv::Vec3f* src1Data = src1.ptr(y); 51 | const cv::Vec3f* src2Data = src2.ptr(y); 52 | for (int x = 0; x < w; ++x) 53 | { 54 | cv::Vec3f& d = dstData[x]; 55 | const cv::Vec3f& s1 = src1Data[x]; 56 | const cv::Vec3f& s2 = src2Data[x]; 57 | for (int i = 0; i < 3; ++i) 58 | { 59 | d[i] = s1[i] + s2[i]; 60 | d[i] = std::min(d[i], 1.0f); 61 | } 62 | } 63 | } 64 | } 65 | 66 | // 变亮 67 | void lighten(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 68 | { 69 | CV_Assert(src1.size() == src2.size()); 70 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 71 | 72 | dst.create(src1.size(), src1.type()); 73 | 74 | const int h = src1.rows; 75 | const int w = src1.cols; 76 | for (int y = 0; y < h; ++y) 77 | { 78 | cv::Vec3f* dstData = dst.ptr(y); 79 | const cv::Vec3f* src1Data = src1.ptr(y); 80 | const cv::Vec3f* src2Data = src2.ptr(y); 81 | for (int x = 0; x < w; ++x) 82 | { 83 | cv::Vec3f& d = dstData[x]; 84 | const cv::Vec3f& s1 = src1Data[x]; 85 | const cv::Vec3f& s2 = src2Data[x]; 86 | for (int i = 0; i < 3; ++i) 87 | { 88 | if (s2[i] <= s1[i]) 89 | { 90 | d[i] = s1[i]; 91 | } 92 | else 93 | { 94 | d[i] = s2[i]; 95 | } 96 | } 97 | } 98 | } 99 | } 100 | 101 | // 变暗 102 | void darken(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 103 | { 104 | CV_Assert(src1.size() == src2.size()); 105 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 106 | 107 | dst.create(src1.size(), src1.type()); 108 | 109 | const int h = src1.rows; 110 | const int w = src1.cols; 111 | for (int y = 0; y < h; ++y) 112 | { 113 | cv::Vec3f* dstData = dst.ptr(y); 114 | const cv::Vec3f* src1Data = src1.ptr(y); 115 | const cv::Vec3f* src2Data = src2.ptr(y); 116 | for (int x = 0; x < w; ++x) 117 | { 118 | cv::Vec3f& d = dstData[x]; 119 | const cv::Vec3f& s1 = src1Data[x]; 120 | const cv::Vec3f& s2 = src2Data[x]; 121 | for (int i = 0; i < 3; ++i) 122 | { 123 | if (s2[i] <= s1[i]) 124 | { 125 | d[i] = s2[i]; 126 | } 127 | else 128 | { 129 | d[i] = s1[i]; 130 | } 131 | } 132 | } 133 | } 134 | } 135 | 136 | int main() 137 | { 138 | cv::Mat imageUp = cv::imread("../../dataset/trees.png"); 139 | cv::Mat imageDown = cv::imread("../../dataset/mountains.png"); 140 | if (imageUp.empty() || imageDown.empty() 141 | || imageUp.size() != imageDown.size()) 142 | { 143 | return -1; 144 | } 145 | 146 | cv::imshow("Original up image", imageUp); 147 | cv::imshow("Original down image", imageDown); 148 | 149 | imageUp.convertTo(imageUp, CV_32FC3, 1.0 / 255.0); 150 | imageDown.convertTo(imageDown, CV_32FC3, 1.0 / 255.0); 151 | 152 | cv::Mat linearBurnImage; 153 | linear_burn(imageUp, imageDown, linearBurnImage); 154 | linearBurnImage.convertTo(linearBurnImage, CV_8UC3, 255.0); 155 | cv::imshow("Linear burn image", linearBurnImage); 156 | 157 | cv::Mat linearDodgeImage; 158 | linear_dodge(imageUp, imageDown, linearDodgeImage); 159 | linearDodgeImage.convertTo(linearDodgeImage, CV_8UC3, 255.0); 160 | cv::imshow("Linear dodge image", linearDodgeImage); 161 | 162 | cv::Mat lightenImage; 163 | lighten(imageUp, imageDown, lightenImage); 164 | lightenImage.convertTo(lightenImage, CV_8UC3, 255.0); 165 | cv::imshow("Lighten image", lightenImage); 166 | 167 | cv::Mat darkenImage; 168 | darken(imageUp, imageDown, darkenImage); 169 | darkenImage.convertTo(darkenImage, CV_8UC3, 255.0); 170 | cv::imshow("Darken image", darkenImage); 171 | 172 | cv::waitKey(); 173 | return 0; 174 | } 175 | -------------------------------------------------------------------------------- /src/20.PSFilterMosaic/20.PSFilterMosaic.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {74F547A5-E67D-4E32-8841-AB7E0D9115F6} 24 | My20PSFilterMosaic 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/20.PSFilterMosaic/20.PSFilterMosaic.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/20.PSFilterMosaic/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/30469217 2 | // http://blog.csdn.net/matrix_space/article/details/40622159 3 | // PS滤镜:马赛克 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void mosaic_effects(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | dst = src.clone(); 13 | 14 | const int P_size = 9; 15 | float k1 = 0.0f; 16 | float k2 = 0.0f; 17 | float m = 0.0f; 18 | float n = 0.0f; 19 | int row = 0; 20 | int col = 0; 21 | 22 | const int h = src.rows; 23 | const int w = src.cols; 24 | 25 | cv::Mat region; 26 | srand((unsigned int)cv::getTickCount()); 27 | for (int i = P_size; i < h - P_size - 1; i += P_size) 28 | { 29 | for (int j = P_size; j < w - P_size - 1; j += P_size) 30 | { 31 | k1 = (rand() % 100) / 100.0f - 0.5f; 32 | k2 = (rand() % 100) / 100.0f - 0.5f; 33 | 34 | m = (k1 * (P_size * 2.0f - 1.0f)); 35 | n = (k2 * (P_size * 2.0f - 1.0f)); 36 | 37 | row = (int)(i + m) % h; 38 | col = (int)(j + n) % w; 39 | 40 | region = dst(cv::Rect(j - P_size, i - P_size, P_size * 2, P_size * 2)); 41 | region.setTo(cv::Scalar(src.at(row, col))); 42 | } 43 | } 44 | } 45 | 46 | int main() 47 | { 48 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 49 | if (colorImage.empty()) 50 | { 51 | return -1; 52 | } 53 | 54 | cv::imshow("Color image", colorImage); 55 | 56 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 57 | 58 | cv::Mat resultImage; 59 | mosaic_effects(colorImage, resultImage); 60 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 61 | cv::imshow("Result image", resultImage); 62 | 63 | cv::waitKey(); 64 | return 0; 65 | } 66 | -------------------------------------------------------------------------------- /src/21.PSFilterNolinearFilter/21.PSFilterNolinearFilter.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/21.PSFilterNolinearFilter/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/38687609 2 | // http://blog.csdn.net/matrix_space/article/details/40623017 3 | // PS图像特效:非线性滤波器 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void nolinear_filter(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | dst = src.clone(); 13 | 14 | cv::Mat B; 15 | cv::Mat G; 16 | cv::Mat R; 17 | cv::Mat bgr[] = { B, G, R }; 18 | cv::split(src, bgr); 19 | 20 | const int P_size = 3; 21 | cv::Mat subMat; 22 | double minVal; 23 | 24 | for (int y = P_size; y < src.rows - P_size - 1; ++y) 25 | { 26 | for (int x = P_size; x < src.cols - P_size - 1; ++x) 27 | { 28 | for (int k = 0; k < 3; ++k) 29 | { 30 | subMat = bgr[k](cv::Range(y - P_size, y + P_size), cv::Range(x - P_size, x + P_size)); 31 | cv::minMaxLoc(subMat, &minVal); 32 | dst.at(y, x)[k] = static_cast(minVal); 33 | } 34 | } 35 | } 36 | } 37 | 38 | int main() 39 | { 40 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 41 | if (colorImage.empty()) 42 | { 43 | return -1; 44 | } 45 | 46 | cv::imshow("Color image", colorImage); 47 | 48 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 49 | 50 | cv::Mat resultImage; 51 | nolinear_filter(colorImage, resultImage); 52 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 53 | cv::imshow("Result image", resultImage); 54 | 55 | cv::waitKey(); 56 | return 0; 57 | } 58 | -------------------------------------------------------------------------------- /src/22.PSImageEffectsWindowShutter/22.PSImageEffectsWindowShutter.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/22.PSImageEffectsWindowShutter/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/25493345 2 | // http://blog.csdn.net/matrix_space/article/details/40627847 3 | // PS图像特效:百叶窗 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void window_shutter(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | dst.create(src.size(), src.type()); 13 | 14 | cv::Mat map(src.size(), src.type()); 15 | 16 | double val; 17 | cv::Mat temp; 18 | for (int i = 0; i < map.rows; ++i) 19 | { 20 | val = i / 255.0; 21 | temp = map.row(i); 22 | temp.setTo(cv::Scalar(val, val, val)); 23 | } 24 | 25 | const int H_shade = 8; 26 | const int Inter = 5; 27 | int num = map.rows / (H_shade + Inter); 28 | 29 | cv::Mat mask(src.size(), src.type(), cv::Scalar(1.0, 1.0, 1.0)); 30 | 31 | int row_begin = 0; 32 | 33 | for (int i = 0; i <= num; ++i) 34 | { 35 | if (i < num) 36 | { 37 | row_begin = i * (H_shade + Inter); 38 | temp = mask.rowRange(row_begin, row_begin + H_shade - 1); 39 | temp.setTo(cv::Scalar(0.0, 0.0, 0.0)); 40 | } 41 | else 42 | { 43 | row_begin = i*(H_shade + Inter); 44 | temp = mask.rowRange(row_begin, mask.rows - 1); 45 | temp.setTo(cv::Scalar(0.0, 0.0, 0.0)); 46 | } 47 | } 48 | 49 | cv::Mat m0; 50 | cv::Mat m1; 51 | cv::Mat m2; 52 | cv::subtract(cv::Scalar(1.0, 1.0, 1.0), mask, m0); 53 | cv::multiply(src, m0, m1); 54 | cv::multiply(map, mask, m2); 55 | 56 | dst = m1 + m2; 57 | } 58 | 59 | int main() 60 | { 61 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 62 | if (colorImage.empty()) 63 | { 64 | return -1; 65 | } 66 | 67 | cv::imshow("Color image", colorImage); 68 | 69 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 70 | 71 | cv::Mat resultImage; 72 | window_shutter(colorImage, resultImage); 73 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 74 | cv::imshow("Result image", resultImage); 75 | 76 | cv::waitKey(); 77 | return 0; 78 | } 79 | -------------------------------------------------------------------------------- /src/23.AdjustSaturation/23.AdjustSaturation.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {8CA2EAE6-A83C-4F89-932B-2E6473DCB0BB} 24 | My23AdjustSaturation 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/23.AdjustSaturation/23.AdjustSaturation.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/23.AdjustSaturation/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/maozefa/article/details/1781208 2 | // http://blog.csdn.net/matrix_space/article/details/40652691 3 | // 饱和度调整 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // percent :[-1.0, 1.0] 9 | void adjust_saturation(const cv::Mat& src, cv::Mat& dst, float percent) 10 | { 11 | CV_Assert(src.type() == CV_32FC3); 12 | CV_Assert(percent >= -1.0f && percent <= 1.0f); 13 | 14 | dst.create(src.size(), src.type()); 15 | 16 | const int pixelCount = src.cols * src.rows; 17 | const cv::Vec3f* srcData = src.ptr(0); 18 | cv::Vec3f* dstData = dst.ptr(0); 19 | for (int i = 0; i < pixelCount; ++i) 20 | { 21 | const float b = srcData[i][0]; 22 | const float g = srcData[i][1]; 23 | const float r = srcData[i][2]; 24 | 25 | float minVal = std::min(std::min(b, g), r); 26 | float maxVal = std::max(std::max(b, g), r); 27 | float delta = (maxVal - minVal) / 255.0f; 28 | float L = (maxVal + minVal) * 0.5f / 255.0f; 29 | float S = std::max(0.5f * delta / L, 0.5f * delta / (1.0f - L)); 30 | 31 | if (percent > 0.0f) 32 | { 33 | float alpha = std::max(S, 1.0f - percent); 34 | alpha = 1.0f / alpha - 1.0f; 35 | dstData[i][0] = b + (b - L * 255.0f) * alpha; 36 | dstData[i][1] = g + (g - L * 255.0f) * alpha; 37 | dstData[i][2] = r + (r - L * 255.0f) * alpha; 38 | } 39 | else 40 | { 41 | float alpha = percent; 42 | dstData[i][0] = L * 255.0f + (b - L * 255.0f) * (1.0f + alpha); 43 | dstData[i][1] = L * 255.0f + (g - L * 255.0f) * (1.0f + alpha); 44 | dstData[i][2] = L * 255.0f + (r - L * 255.0f) * (1.0f + alpha); 45 | } 46 | } 47 | } 48 | 49 | int main() 50 | { 51 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 52 | if (colorImage.empty()) 53 | { 54 | return -1; 55 | } 56 | 57 | cv::imshow("Color image", colorImage); 58 | 59 | colorImage.convertTo(colorImage, CV_32FC3); 60 | 61 | cv::Mat resultImage; 62 | adjust_saturation(colorImage, resultImage, -0.5f); 63 | resultImage.convertTo(resultImage, CV_8UC3); 64 | cv::imshow("Result image", resultImage); 65 | 66 | cv::waitKey(); 67 | return 0; 68 | } 69 | -------------------------------------------------------------------------------- /src/24.AdjustBlackAndWhite/24.AdjustBlackAndWhite.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/24.AdjustBlackAndWhite/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/maozefa/article/details/8302198 2 | // http://blog.csdn.net/matrix_space/article/details/40681919 3 | // 黑白调整 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void adjust_black_and_white(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | dst.create(src.size(), CV_32FC1); 13 | 14 | float color_ratio[6] = { 0.4f, 0.6f, 0.4f, 0.6f, 0.2f, 0.8f }; 15 | float ratio_max_mid = 0.0f; 16 | float ratio_max = 0.0f; 17 | int index = 0; 18 | 19 | const int pixelCount = src.cols * src.rows; 20 | const cv::Vec3f* srcData = src.ptr(0); 21 | float* dstData = dst.ptr(0); 22 | for (int i = 0; i < pixelCount; ++i) 23 | { 24 | const float b = srcData[i][0]; 25 | const float g = srcData[i][1]; 26 | const float r = srcData[i][2]; 27 | 28 | float minVal = std::min(std::min(b, g), r); 29 | float maxVal = std::max(std::max(b, g), r); 30 | float midVal = b + g + r - minVal - maxVal; 31 | 32 | const float eps = 1e-6f; 33 | if (std::abs(minVal - r) < eps) 34 | { 35 | index = 0; 36 | } 37 | else if (std::abs(minVal - g) < eps) 38 | { 39 | index = 2; 40 | } 41 | else 42 | { 43 | index = 4; 44 | } 45 | ratio_max_mid = color_ratio[2 == index ? 1 : (index + 3) % 6 + 1]; // 注意这里原文的索引会越界 46 | 47 | if (std::abs(maxVal - r) < eps) 48 | { 49 | index = 1; 50 | } 51 | else if (std::abs(maxVal - g) < eps) 52 | { 53 | index = 3; 54 | } 55 | else 56 | { 57 | index = 5; 58 | } 59 | ratio_max = color_ratio[index]; 60 | 61 | dstData[i] = (maxVal - midVal) * ratio_max + (midVal - minVal) * ratio_max_mid + minVal; 62 | if (dstData[i] < eps) 63 | { 64 | int n = 0; 65 | } 66 | } 67 | } 68 | 69 | int main() 70 | { 71 | cv::Mat colorImage = cv::imread("../../dataset/girl.jpg"); 72 | if (colorImage.empty()) 73 | { 74 | return -1; 75 | } 76 | 77 | cv::imshow("Color image", colorImage); 78 | 79 | colorImage.convertTo(colorImage, CV_32FC3); 80 | 81 | cv::Mat resultImage; 82 | adjust_black_and_white(colorImage, resultImage); 83 | resultImage.convertTo(resultImage, CV_8UC1); 84 | cv::imshow("Result image", resultImage); 85 | 86 | cv::waitKey(); 87 | return 0; 88 | } 89 | -------------------------------------------------------------------------------- /src/25.ColorUniformGradient/25.ColorUniformGradient.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/25.ColorUniformGradient/main.cpp: -------------------------------------------------------------------------------- 1 | // http://www.linuxidc.com/Linux/2012-09/70006.htm 2 | // http://blog.csdn.net/matrix_space/article/details/40893795 3 | // 生成关于某点的颜色径向均匀渐变图像 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void color_uniform_gradient(int width, int height, cv::Mat& dst) 9 | { 10 | CV_Assert(width > 0 && height > 0); 11 | 12 | dst.create(cv::Size(width, height), CV_32FC3); 13 | 14 | cv::Scalar a(255.0, 255.0, 255.0); 15 | cv::Scalar b(0.0, 0.0, 0.0); 16 | 17 | dst.setTo(a); 18 | 19 | cv::Point2f origin(0.0f, 0.0f); 20 | cv::Point2f center(width / 2.0f, height / 2.0f); 21 | 22 | float distance = 0.0f; 23 | 24 | if (origin.x <= center.x && origin.y <= center.y) 25 | { 26 | distance = std::sqrt((width - 1 - origin.x) * (width - 1 - origin.x) 27 | + (height - 1 - origin.y) * (height - 1 - origin.y)); 28 | } 29 | else if (origin.x <= center.x && origin.y > center.y) 30 | { 31 | distance = std::sqrt((width - 1 - origin.x) * (width - 1 - origin.x) 32 | + origin.y * origin.y); 33 | } 34 | else if (origin.x > center.x && origin.y > center.y) 35 | { 36 | distance = std::sqrt(origin.x * origin.x + origin.y * origin.y); 37 | } 38 | else 39 | { 40 | distance = std::sqrt(origin.x * origin.x 41 | + (height - 1 - origin.y) * (height - 1 - origin.y)); 42 | } 43 | 44 | float weightB = (float)(b[0] - a[0]) / distance; 45 | float weightG = (float)(b[1] - a[1]) / distance; 46 | float weightR = (float)(b[2] - a[2]) / distance; 47 | 48 | for (int y = 0; y < height; ++y) 49 | { 50 | for (int x = 0; x < width; ++x) 51 | { 52 | float dis = std::sqrt((y - origin.y) * (y - origin.y) 53 | + (x - origin.x) * (x - origin.x)); 54 | dst.at(y, x)[0] = dst.at(y, x)[0] + weightB * dis; 55 | dst.at(y, x)[1] = dst.at(y, x)[1] + weightG * dis; 56 | dst.at(y, x)[2] = dst.at(y, x)[2] + weightR * dis; 57 | } 58 | } 59 | } 60 | 61 | int main() 62 | { 63 | cv::Mat resultImage; 64 | color_uniform_gradient(800, 600, resultImage); 65 | resultImage.convertTo(resultImage, CV_8UC3); 66 | cv::imshow("Result image", resultImage); 67 | 68 | cv::waitKey(); 69 | return 0; 70 | } 71 | -------------------------------------------------------------------------------- /src/26.RadialBlur/26.RadialBlur.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {2360A783-39FF-45E1-AE47-CDFEC06C1B04} 24 | My26RadialBlur 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/26.RadialBlur/26.RadialBlur.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/26.RadialBlur/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/yangtrees/article/details/9103935 2 | // http://blog.csdn.net/matrix_space/article/details/40896455 3 | // 径向模糊 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void radial_blur(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | dst.create(src.size(), src.type()); 13 | 14 | const int h = src.rows; 15 | const int w = src.cols; 16 | 17 | float R = 0.0f; 18 | float angle = 0.0f; 19 | cv::Point center(w / 2, h / 2); 20 | float t1 = 0.0f; 21 | float t2 = 0.0f; 22 | float t3 = 0.0f; 23 | int new_x = 0; 24 | int new_y = 0; 25 | const int Num = 20; 26 | 27 | for (int y = 0; y < h; ++y) 28 | { 29 | for (int x = 0; x < w; ++x) 30 | { 31 | t1 = 0.0f; 32 | t2 = 0.0f; 33 | t3 = 0.0f; 34 | R = (float)std::sqrt((y - center.y) * (y - center.y) + (x - center.x) * (x - center.x)); 35 | angle = std::atan2((float)(y - center.y), (float)(x - center.x)); 36 | for (int mm = 0; mm < Num; ++mm) 37 | { 38 | float tmR = R - mm > 0.0f ? R - mm : 0.0f; 39 | new_x = (int)(tmR * std::cos(angle)) + center.x; 40 | new_y = (int)(tmR * std::sin(angle)) + center.y; 41 | 42 | if (new_x < 0) 43 | new_x = 0; 44 | if (new_x > w - 1) 45 | new_x = w - 1; 46 | if (new_y < 0) 47 | new_y = 0; 48 | if (new_y > h - 1) 49 | new_y = h - 1; 50 | 51 | t1 = t1 + src.at(new_y, new_x)[0]; 52 | t2 = t2 + src.at(new_y, new_x)[1]; 53 | t3 = t3 + src.at(new_y, new_x)[2]; 54 | } 55 | 56 | dst.at(y, x)[0] = t1 / Num; 57 | dst.at(y, x)[1] = t2 / Num; 58 | dst.at(y, x)[2] = t3 / Num; 59 | } 60 | } 61 | } 62 | 63 | int main() 64 | { 65 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 66 | if (colorImage.empty()) 67 | { 68 | return -1; 69 | } 70 | 71 | cv::imshow("Color image", colorImage); 72 | 73 | colorImage.convertTo(colorImage, CV_32FC3); 74 | 75 | cv::Mat resultImage; 76 | radial_blur(colorImage, resultImage); 77 | resultImage.convertTo(resultImage, CV_8UC3); 78 | cv::imshow("Result image", resultImage); 79 | 80 | cv::waitKey(); 81 | return 0; 82 | } 83 | -------------------------------------------------------------------------------- /src/27.RotateBlur2/27.RotateBlur2.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {253D18E1-7821-46D6-8F5E-F1C2562748F9} 24 | My27RotateBlur2 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/27.RotateBlur2/27.RotateBlur2.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/27.RotateBlur2/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40897935 2 | // 旋转模糊(二) 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | #define PI 3.1415926f 8 | 9 | void rotate_blur(const cv::Mat& src, cv::Mat& dst) 10 | { 11 | CV_Assert(src.type() == CV_32FC3); 12 | 13 | dst.create(src.size(), src.type()); 14 | 15 | const int height = src.rows; 16 | const int width = src.cols; 17 | 18 | int n_point = 1; 19 | float angle = 30.0f; 20 | float w = angle * PI / 180.0f; 21 | float w_2 = w * w; 22 | int num = 3; 23 | int num2 = num * num; 24 | 25 | cv::Point center(width / 2, height / 2); 26 | float t1 = 0.0f; 27 | float t2 = 0.0f; 28 | float t3 = 0.0f; 29 | int x1 = 0; 30 | int y1 = 0; 31 | int x2 = 0; 32 | int y2 = 0; 33 | int new_x = 0; 34 | int new_y = 0; 35 | 36 | for (int y = 0; y < height; ++y) 37 | { 38 | for (int x = 0; x < width; ++x) 39 | { 40 | n_point = 1; 41 | x1 = x - center.x; 42 | y1 = center.y - y; 43 | 44 | t1 = src.at(y, x)[0]; 45 | t2 = src.at(y, x)[1]; 46 | t3 = src.at(y, x)[2]; 47 | 48 | x2 = x1; 49 | y2 = y1; 50 | 51 | for (int mm = 0; mm < num; ++mm) 52 | { 53 | x1 = x2; 54 | y1 = y2; 55 | 56 | // anticlockwise 57 | x2 = static_cast(x1 - w * y1 / num - w_2 * x1 / num2); 58 | y2 = static_cast(y1 + w * x1 / num - w_2 * y1 / num2); 59 | 60 | new_x = x2 + center.x; 61 | new_y = center.y - y2; 62 | 63 | if (new_x > 0 && new_x < width - 1 && new_y > 0 && new_y < height - 1) 64 | { 65 | t1 = t1 + src.at(new_y, new_x)[0]; 66 | t2 = t2 + src.at(new_y, new_x)[1]; 67 | t3 = t3 + src.at(new_y, new_x)[2]; 68 | ++n_point; 69 | } 70 | } 71 | 72 | dst.at(y, x)[0] = t1 / n_point; 73 | dst.at(y, x)[1] = t2 / n_point; 74 | dst.at(y, x)[2] = t3 / n_point; 75 | } 76 | } 77 | } 78 | 79 | int main() 80 | { 81 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 82 | if (colorImage.empty()) 83 | { 84 | return -1; 85 | } 86 | 87 | cv::imshow("Color image", colorImage); 88 | 89 | colorImage.convertTo(colorImage, CV_32FC3); 90 | 91 | cv::Mat resultImage; 92 | rotate_blur(colorImage, resultImage); 93 | resultImage.convertTo(resultImage, CV_8UC3); 94 | cv::imshow("Result image", resultImage); 95 | 96 | cv::waitKey(); 97 | return 0; 98 | } 99 | -------------------------------------------------------------------------------- /src/28.RotateBlur/28.RotateBlur.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {9322B75D-527F-40AF-8D97-444B065873F7} 24 | My28RotateBlur 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/28.RotateBlur/28.RotateBlur.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/28.RotateBlur/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40897645 2 | // 旋转模糊 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | void rotate_blur(const cv::Mat& src, cv::Mat& dst) 8 | { 9 | CV_Assert(src.type() == CV_32FC3); 10 | 11 | dst.create(src.size(), src.type()); 12 | 13 | const int height = src.rows; 14 | const int width = src.cols; 15 | 16 | float R = 0.0f; 17 | float angle = 0.0f; 18 | 19 | cv::Point center(width / 2, height / 2); 20 | float t1 = 0.0f; 21 | float t2 = 0.0f; 22 | float t3 = 0.0f; 23 | int new_x = 0; 24 | int new_y = 0; 25 | int num = 30; 26 | 27 | for (int y = 0; y < height; ++y) 28 | { 29 | for (int x = 0; x < width; ++x) 30 | { 31 | t1 = 0.0f; 32 | t2 = 0.0f; 33 | t3 = 0.0f; 34 | R = (float)std::sqrt((y - center.y) * (y - center.y) + (x - center.x) * (x - center.x)); 35 | angle = std::atan2((float)(y - center.y), (float)(x - center.x)); 36 | 37 | for (int mm = 0; mm < num; ++mm) 38 | { 39 | angle = angle + 0.01f; 40 | 41 | new_x = static_cast(R * std::cos(angle) + center.x); 42 | new_y = static_cast(R * std::sin(angle) + center.y); 43 | 44 | if (new_x < 0) 45 | new_x = 0; 46 | if (new_x > width - 1) 47 | new_x = width - 1; 48 | if (new_y < 0) 49 | new_y = 0; 50 | if (new_y > height - 1) 51 | new_y = height - 1; 52 | 53 | t1 = t1 + src.at(new_y, new_x)[0]; 54 | t2 = t2 + src.at(new_y, new_x)[1]; 55 | t3 = t3 + src.at(new_y, new_x)[2]; 56 | } 57 | 58 | dst.at(y, x)[0] = t1 / num; 59 | dst.at(y, x)[1] = t2 / num; 60 | dst.at(y, x)[2] = t3 / num; 61 | } 62 | } 63 | } 64 | 65 | int main() 66 | { 67 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 68 | if (colorImage.empty()) 69 | { 70 | return -1; 71 | } 72 | 73 | cv::imshow("Color image", colorImage); 74 | 75 | colorImage.convertTo(colorImage, CV_32FC3); 76 | 77 | cv::Mat resultImage; 78 | rotate_blur(colorImage, resultImage); 79 | resultImage.convertTo(resultImage, CV_8UC3); 80 | cv::imshow("Result image", resultImage); 81 | 82 | cv::waitKey(); 83 | return 0; 84 | } 85 | -------------------------------------------------------------------------------- /src/29.GaussianBlur/29.GaussianBlur.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {322F7DCE-AED1-4D52-8974-A07E626D1EB0} 24 | My29GaussianBlur 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/29.GaussianBlur/29.GaussianBlur.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/29.GaussianBlur/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40898103 2 | // 高斯模糊与毛玻璃特效 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | void gauss_blur(const cv::Mat& src, cv::Mat& dst) 8 | { 9 | CV_Assert(src.type() == CV_32FC3); 10 | 11 | dst = src.clone(); 12 | 13 | cv::Mat temp = dst.rowRange(100, 300); 14 | 15 | cv::GaussianBlur(temp, temp, cv::Size(21, 21), 0.0); 16 | cv::GaussianBlur(temp, temp, cv::Size(21, 21), 0.0); 17 | } 18 | 19 | int main() 20 | { 21 | cv::Mat colorImage = cv::imread("../../dataset/girl.jpg"); 22 | if (colorImage.empty()) 23 | { 24 | return -1; 25 | } 26 | 27 | cv::imshow("Color image", colorImage); 28 | 29 | colorImage.convertTo(colorImage, CV_32FC3); 30 | 31 | cv::Mat resultImage; 32 | gauss_blur(colorImage, resultImage); 33 | resultImage.convertTo(resultImage, CV_8UC3); 34 | cv::imshow("Result image", resultImage); 35 | 36 | cv::waitKey(); 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /src/3.PSImageLayerBlend3/3.PSImageLayerBlend3.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {C0EDD8AC-C8CD-4B16-A9CC-71DA416457B1} 24 | My3PSImageLayerBlend3 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/3.PSImageLayerBlend3/3.PSImageLayerBlend3.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/3.PSImageLayerBlend3/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/22426633 2 | // http://blog.csdn.net/matrix_space/article/details/37913937 3 | // PS图层混合算法(三):滤色、叠加、柔光、强光 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 滤色 9 | void screen(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 10 | { 11 | CV_Assert(src1.size() == src2.size()); 12 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 13 | 14 | dst.create(src1.size(), src1.type()); 15 | 16 | const int h = src1.rows; 17 | const int w = src1.cols; 18 | for (int y = 0; y < h; ++y) 19 | { 20 | cv::Vec3f* dstData = dst.ptr(y); 21 | const cv::Vec3f* src1Data = src1.ptr(y); 22 | const cv::Vec3f* src2Data = src2.ptr(y); 23 | for (int x = 0; x < w; ++x) 24 | { 25 | cv::Vec3f& d = dstData[x]; 26 | const cv::Vec3f& s1 = src1Data[x]; 27 | const cv::Vec3f& s2 = src2Data[x]; 28 | for (int i = 0; i < 3; ++i) 29 | { 30 | d[i] = 1.0f - (1.0f - s1[i]) * (1.0f - s2[i]); 31 | } 32 | } 33 | } 34 | } 35 | 36 | // 叠加 37 | void add_color(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 38 | { 39 | CV_Assert(src1.size() == src2.size()); 40 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 41 | 42 | dst.create(src1.size(), src1.type()); 43 | 44 | const int h = src1.rows; 45 | const int w = src1.cols; 46 | for (int y = 0; y < h; ++y) 47 | { 48 | cv::Vec3f* dstData = dst.ptr(y); 49 | const cv::Vec3f* src1Data = src1.ptr(y); 50 | const cv::Vec3f* src2Data = src2.ptr(y); 51 | for (int x = 0; x < w; ++x) 52 | { 53 | cv::Vec3f& d = dstData[x]; 54 | const cv::Vec3f& s1 = src1Data[x]; 55 | const cv::Vec3f& s2 = src2Data[x]; 56 | for (int i = 0; i < 3; ++i) 57 | { 58 | if (s2[i] <= 0.5f) 59 | { 60 | d[i] = 2.0f * s1[i] * s2[i]; 61 | } 62 | else 63 | { 64 | d[i] = 1.0f - 2.0f * (1.0f - s1[i]) * (1.0f - s2[i]); 65 | } 66 | } 67 | } 68 | } 69 | } 70 | 71 | // 柔光 72 | void soft_lighten(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 73 | { 74 | CV_Assert(src1.size() == src2.size()); 75 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 76 | 77 | dst.create(src1.size(), src1.type()); 78 | 79 | const int h = src1.rows; 80 | const int w = src2.cols; 81 | for (int y = 0; y < h; ++y) 82 | { 83 | cv::Vec3f* dstData = dst.ptr(y); 84 | const cv::Vec3f* src1Data = src1.ptr(y); 85 | const cv::Vec3f* src2Data = src2.ptr(y); 86 | for (int x = 0; x < w; ++x) 87 | { 88 | cv::Vec3f& d = dstData[x]; 89 | const cv::Vec3f& s1 = src1Data[x]; 90 | const cv::Vec3f& s2 = src2Data[x]; 91 | for (int i = 0; i < 3; ++i) 92 | { 93 | if (s1[i] <= 0.5f) 94 | { 95 | d[i] = (2 * s1[i] - 1.0f) * (s2[i] - s2[i] * s2[i]) + s2[i]; 96 | } 97 | else 98 | { 99 | d[i] = (2 * s1[i] - 1.0f) * (std::sqrt(s2[i]) - s2[i]) + s2[i]; 100 | d[i] = std::min(d[i], 1.0f); 101 | } 102 | } 103 | } 104 | } 105 | } 106 | 107 | // 强光 108 | void strong_lighten(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 109 | { 110 | CV_Assert(src1.size() == src2.size()); 111 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 112 | 113 | dst.create(src1.size(), src1.type()); 114 | 115 | const int h = src1.rows; 116 | const int w = src1.cols; 117 | for (int y = 0; y < h; ++y) 118 | { 119 | cv::Vec3f* dstData = dst.ptr(y); 120 | const cv::Vec3f* src1Data = src1.ptr(y); 121 | const cv::Vec3f* src2Data = src2.ptr(y); 122 | for (int x = 0; x < w; ++x) 123 | { 124 | cv::Vec3f& d = dstData[x]; 125 | const cv::Vec3f& s1 = src1Data[x]; 126 | const cv::Vec3f& s2 = src2Data[x]; 127 | for (int i = 0; i < 3; ++i) 128 | { 129 | if (s1[i] <= 0.5f) 130 | { 131 | d[i] = 2.0f * s1[i] * s2[i]; 132 | } 133 | else 134 | { 135 | d[i] = 1.0f - 2.0f * (1.0f - s1[i]) * (1.0f - s2[i]); 136 | } 137 | } 138 | } 139 | } 140 | } 141 | 142 | int main() 143 | { 144 | cv::Mat imageUp = cv::imread("../../dataset/trees.png"); 145 | cv::Mat imageDown = cv::imread("../../dataset/mountains.png"); 146 | if (imageUp.empty() || imageDown.empty() 147 | || imageUp.size() != imageDown.size()) 148 | { 149 | return -1; 150 | } 151 | 152 | cv::imshow("Original up image", imageUp); 153 | cv::imshow("Original down image", imageDown); 154 | 155 | imageUp.convertTo(imageUp, CV_32FC3, 1.0 / 255.0); 156 | imageDown.convertTo(imageDown, CV_32FC3, 1.0 / 255.0); 157 | 158 | cv::Mat screenImage; 159 | screen(imageUp, imageDown, screenImage); 160 | screenImage.convertTo(screenImage, CV_8UC3, 255.0); 161 | cv::imshow("Screen image", screenImage); 162 | 163 | cv::Mat addColorImage; 164 | add_color(imageUp, imageDown, addColorImage); 165 | addColorImage.convertTo(addColorImage, CV_8UC3, 255.0); 166 | cv::imshow("Add color image", addColorImage); 167 | 168 | cv::Mat softLigtenImage; 169 | soft_lighten(imageUp, imageDown, softLigtenImage); 170 | softLigtenImage.convertTo(softLigtenImage, CV_8UC3, 255.0); 171 | cv::imshow("Soft lighten image", softLigtenImage); 172 | 173 | cv::Mat strongLightenImage; 174 | strong_lighten(imageUp, imageDown, strongLightenImage); 175 | strongLightenImage.convertTo(strongLightenImage, CV_8UC3, 255.0); 176 | cv::imshow("Strong lighten image", strongLightenImage); 177 | 178 | cv::waitKey(); 179 | return 0; 180 | } 181 | -------------------------------------------------------------------------------- /src/30.Plane2PolarCoordinates/30.Plane2PolarCoordinates.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/30.Plane2PolarCoordinates/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/42361595 2 | // PS滤镜算法之平面坐标到极坐标的变换 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | #define PI 3.1415926f 8 | 9 | void plane_2_polar(const cv::Mat& src, cv::Mat& dst) 10 | { 11 | CV_Assert(src.type() == CV_32FC3); 12 | 13 | dst.create(src.size(), src.type()); 14 | 15 | const int height = src.rows; 16 | const int width = src.cols; 17 | 18 | float R = height / 2.0f; 19 | float e = (float)width / (float)height; 20 | 21 | cv::Point center(width / 2, height / 2); 22 | 23 | float R1 = 0.0f; 24 | float new_x = 0.0f; 25 | float new_y = 0; 26 | float p = 0.0f; 27 | float q = 0.0f; 28 | float x1 = 0.0f; 29 | float y1 = 0.0f; 30 | float theta = 0.0f; 31 | 32 | for (int y = 0; y < height; ++y) 33 | { 34 | for (int x = 0; x < width; ++x) 35 | { 36 | theta = std::atan2((float)((center.y - y) * e), (float)(x - center.x)); 37 | 38 | if (center.y - y <= 0.0f) 39 | theta = theta + 2 * PI; 40 | 41 | R1 = (center.y - y) / std::sin(theta); 42 | new_y = R1 * height / R; 43 | new_x = theta * width / (2 * PI); 44 | 45 | if (new_x < 0.0f) 46 | new_x = 0.0f; 47 | if (new_x > width - 1) 48 | new_x = (float)(width - 2); 49 | if (new_y < 0.0f) 50 | new_y = 0.0f; 51 | if (new_y > height - 1) 52 | new_y = (float)(height - 2); 53 | 54 | x1 = new_x; 55 | y1 = new_y; 56 | 57 | p = new_x - x1; 58 | q = new_y - y1; 59 | 60 | for (int k = 0; k < 3; ++k) 61 | { 62 | dst.at(y, x)[k] = 63 | (1.0f - p) * (1.0f - q) * src.at((int)y1, (int)x1)[k] + 64 | (p) * (1.0f - 1) * src.at((int)y1, (int)x1 + 1)[k] + 65 | (1.0f - p) * (q)* src.at((int)y1 + 1, (int)x1)[k] + 66 | (p) * (q)* src.at((int)y1 + 1, (int)x1 + 1)[k]; 67 | } 68 | } 69 | } 70 | } 71 | 72 | int main() 73 | { 74 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 75 | if (colorImage.empty()) 76 | { 77 | return -1; 78 | } 79 | 80 | cv::imshow("Color image", colorImage); 81 | 82 | colorImage.convertTo(colorImage, CV_32FC3); 83 | 84 | cv::Mat resultImage; 85 | plane_2_polar(colorImage, resultImage); 86 | resultImage.convertTo(resultImage, CV_8UC3); 87 | cv::imshow("Result image", resultImage); 88 | 89 | cv::waitKey(); 90 | return 0; 91 | } 92 | -------------------------------------------------------------------------------- /src/4.PSImageLayerBlend4/4.PSImageLayerBlend4.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {512D1D02-EB59-40D3-BDFC-9C858C40E4E7} 24 | My4PSImageLayerBlend4 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/4.PSImageLayerBlend4/4.PSImageLayerBlend4.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/4.PSImageLayerBlend4/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/22427285 2 | // http://blog.csdn.net/matrix_space/article/details/37914011 3 | // PS图层混合算法(四):亮光、点光、线性光、实色混合 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 亮光 9 | void vivid_ligten(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 10 | { 11 | CV_Assert(src1.size() == src2.size()); 12 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 13 | 14 | dst.create(src1.size(), src1.type()); 15 | const float threshold = 1e-6f; 16 | 17 | const int h = src1.rows; 18 | const int w = src1.cols; 19 | for (int y = 0; y < h; ++y) 20 | { 21 | cv::Vec3f* dstData = dst.ptr(y); 22 | const cv::Vec3f* src1Data = src1.ptr(y); 23 | const cv::Vec3f* src2Data = src2.ptr(y); 24 | for (int x = 0; x < w; ++x) 25 | { 26 | cv::Vec3f& d = dstData[x]; 27 | const cv::Vec3f& s1 = src1Data[x]; 28 | const cv::Vec3f& s2 = src2Data[x]; 29 | for (int i = 0; i < 3; ++i) 30 | { 31 | if (s1[i] <= 0.5f) 32 | { 33 | if (2.0f * s1[i] > threshold) 34 | { 35 | d[i] = 1.0f - (1.0f - s2[i]) / (2.0f * s1[i]); 36 | d[i] = std::max(d[i], 0.0f); 37 | } 38 | else 39 | { 40 | d[i] = 0.0f; 41 | } 42 | } 43 | else 44 | { 45 | if (1.0f - s1[i] > threshold) 46 | { 47 | d[i] = s2[i] / (2.0f * (1.0f - s1[i])); 48 | d[i] = std::min(d[i], 1.0f); 49 | } 50 | else 51 | { 52 | d[i] = 1.0f; 53 | } 54 | } 55 | } 56 | } 57 | } 58 | } 59 | 60 | // 点光 61 | void pin_lighten(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 62 | { 63 | CV_Assert(src1.size() == src2.size()); 64 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 65 | 66 | dst.create(src1.size(), src1.type()); 67 | 68 | const int h = src1.rows; 69 | const int w = src1.cols; 70 | for (int y = 0; y < h; ++y) 71 | { 72 | cv::Vec3f* dstData = dst.ptr(y); 73 | const cv::Vec3f* src1Data = src1.ptr(y); 74 | const cv::Vec3f* src2Data = src2.ptr(y); 75 | for (int x = 0; x < w; ++x) 76 | { 77 | cv::Vec3f& d = dstData[x]; 78 | const cv::Vec3f& s1 = src1Data[x]; 79 | const cv::Vec3f& s2 = src2Data[x]; 80 | for (int i = 0; i < 3; ++i) 81 | { 82 | if (s1[i] > 0.5f) 83 | { 84 | d[i] = std::max(2.0f * (s1[i] - 0.5f), s2[i]); 85 | } 86 | else 87 | { 88 | d[i] = std::min(2.0f * s1[i], s2[i]); 89 | } 90 | } 91 | } 92 | } 93 | } 94 | 95 | // 线性光 96 | void linear_lighten(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 97 | { 98 | CV_Assert(src1.size() == src2.size()); 99 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 100 | 101 | dst.create(src1.size(), src1.type()); 102 | 103 | const int h = src1.rows; 104 | const int w = src1.cols; 105 | for (int y = 0; y < h; ++y) 106 | { 107 | cv::Vec3f* dstData = dst.ptr(y); 108 | const cv::Vec3f* src1Data = src1.ptr(y); 109 | const cv::Vec3f* src2Data = src2.ptr(y); 110 | for (int x = 0; x < w; ++x) 111 | { 112 | cv::Vec3f& d = dstData[x]; 113 | const cv::Vec3f& s1 = src1Data[x]; 114 | const cv::Vec3f& s2 = src2Data[x]; 115 | for (int i = 0; i < 3; ++i) 116 | { 117 | d[i] = s2[i] + 2.0f * s1[i] - 1.0f; 118 | d[i] = std::max(d[i], 0.0f); 119 | d[i] = std::min(d[i], 1.0f); 120 | } 121 | } 122 | } 123 | } 124 | 125 | // 实色混合 126 | void hard_mix(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 127 | { 128 | CV_Assert(src1.size() == src2.size()); 129 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 130 | 131 | dst.create(src1.size(), src1.type()); 132 | 133 | const int h = src1.rows; 134 | const int w = src1.cols; 135 | for (int y = 0; y < h; ++y) 136 | { 137 | cv::Vec3f* dstData = dst.ptr(y); 138 | const cv::Vec3f* src1Data = src1.ptr(y); 139 | const cv::Vec3f* src2Data = src2.ptr(y); 140 | for (int x = 0; x < w; ++x) 141 | { 142 | cv::Vec3f& d = dstData[x]; 143 | const cv::Vec3f& s1 = src1Data[x]; 144 | const cv::Vec3f& s2 = src2Data[x]; 145 | for (int i = 0; i < 3; ++i) 146 | { 147 | if (s1[i] <= 1.0f - s2[i]) 148 | { 149 | d[i] = 0.0f; 150 | } 151 | else 152 | { 153 | d[i] = 1.0f; 154 | } 155 | } 156 | } 157 | } 158 | } 159 | 160 | int main() 161 | { 162 | cv::Mat imageUp = cv::imread("../../dataset/trees.png"); 163 | cv::Mat imageDown = cv::imread("../../dataset/mountains.png"); 164 | if (imageUp.empty() || imageDown.empty() 165 | || imageUp.size() != imageDown.size()) 166 | { 167 | return -1; 168 | } 169 | 170 | cv::imshow("Original up image", imageUp); 171 | cv::imshow("Original down image", imageDown); 172 | 173 | imageUp.convertTo(imageUp, CV_32FC3, 1.0 / 255.0); 174 | imageDown.convertTo(imageDown, CV_32FC3, 1.0 / 255.0); 175 | 176 | cv::Mat vividLightenImage; 177 | vivid_ligten(imageUp, imageDown, vividLightenImage); 178 | vividLightenImage.convertTo(vividLightenImage, CV_8UC3, 255.0); 179 | cv::imshow("Vivid lighten image", vividLightenImage); 180 | 181 | cv::Mat pinLightenImage; 182 | pin_lighten(imageUp, imageDown, pinLightenImage); 183 | pinLightenImage.convertTo(pinLightenImage, CV_8UC3, 255.0); 184 | cv::imshow("Pin lighten image", pinLightenImage); 185 | 186 | cv::Mat linearLightenImage; 187 | linear_lighten(imageUp, imageDown, linearLightenImage); 188 | linearLightenImage.convertTo(linearLightenImage, CV_8UC3, 255.0); 189 | cv::imshow("Linear lighten image", linearLightenImage); 190 | 191 | cv::Mat hardMixImage; 192 | hard_mix(imageUp, imageDown, hardMixImage); 193 | hardMixImage.convertTo(hardMixImage, CV_8UC3, 255.0); 194 | cv::imshow("Hard mix image", hardMixImage); 195 | 196 | cv::waitKey(); 197 | return 0; 198 | } 199 | -------------------------------------------------------------------------------- /src/5.PSImageLayerBlend6/5.PSImageLayerBlend6.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {03B3EFDA-0CA3-4D1F-8B94-DCA0745F7B4A} 24 | My5PSImageLayerBlend6 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/5.PSImageLayerBlend6/5.PSImageLayerBlend6.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/5.PSImageLayerBlend6/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/22488467 2 | // http://blog.csdn.net/matrix_space/article/details/37914085 3 | // PS图层混合算法(六):差值、溶解、排除 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | // 差值 9 | void difference(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 10 | { 11 | CV_Assert(src1.size() == src2.size()); 12 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 13 | 14 | dst = src1 - src2; 15 | dst = cv::abs(dst); 16 | } 17 | 18 | // 排除 19 | void exclusion(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst) 20 | { 21 | CV_Assert(src1.size() == src2.size()); 22 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 23 | 24 | dst.create(src1.size(), src1.type()); 25 | 26 | const int h = src1.rows; 27 | const int w = src1.cols; 28 | for (int y = 0; y < h; ++y) 29 | { 30 | cv::Vec3f* dstData = dst.ptr(y); 31 | const cv::Vec3f* src1Data = src1.ptr(y); 32 | const cv::Vec3f* src2Data = src2.ptr(y); 33 | for (int x = 0; x < w; ++x) 34 | { 35 | cv::Vec3f& d = dstData[x]; 36 | const cv::Vec3f& s1 = src1Data[x]; 37 | const cv::Vec3f& s2 = src2Data[x]; 38 | for (int i = 0; i < 3; ++i) 39 | { 40 | d[i] = s1[i] + s2[i] - 2.0f * s1[i] * s2[i]; 41 | d[i] = std::min(d[i], 1.0f); 42 | } 43 | } 44 | } 45 | } 46 | 47 | // 溶解 48 | void dissolve(const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dst, float alpha) 49 | { 50 | CV_Assert(src1.size() == src2.size()); 51 | CV_Assert(src1.type() == CV_32FC3 && src2.type() == CV_32FC3); 52 | CV_Assert(alpha >= 0.0f && alpha <= 1.0f); 53 | 54 | dst = src1.clone(); 55 | 56 | cv::Mat randMat(src1.size(), CV_32FC1); 57 | cv::randu(randMat, 0.0f, 1.0f); 58 | 59 | const int h = src1.rows; 60 | const int w = src1.cols; 61 | for (int y = 0; y < h; ++y) 62 | { 63 | cv::Vec3f* dstData = dst.ptr(y); 64 | const cv::Vec3f* src2Data = src2.ptr(y); 65 | const float* randData = randMat.ptr(y); 66 | for (int x = 0; x < w; ++x) 67 | { 68 | cv::Vec3f& d = dstData[x]; 69 | const cv::Vec3f& s2 = src2Data[x]; 70 | if (randData[x] < alpha) 71 | { 72 | for (int i = 0; i < 3; ++i) 73 | { 74 | d[i] = s2[i]; 75 | } 76 | } 77 | } 78 | } 79 | } 80 | 81 | int main() 82 | { 83 | cv::Mat imageUp = cv::imread("../../dataset/trees.png"); 84 | cv::Mat imageDown = cv::imread("../../dataset/mountains.png"); 85 | if (imageUp.empty() || imageDown.empty() 86 | || imageUp.size() != imageDown.size()) 87 | { 88 | return -1; 89 | } 90 | 91 | cv::imshow("Original up image", imageUp); 92 | cv::imshow("Original down image", imageDown); 93 | 94 | imageUp.convertTo(imageUp, CV_32FC3, 1.0 / 255.0); 95 | imageDown.convertTo(imageDown, CV_32FC3, 1.0 / 255.0); 96 | 97 | cv::Mat differenceImage; 98 | difference(imageUp, imageDown, differenceImage); 99 | differenceImage.convertTo(differenceImage, CV_8UC3, 255.0); 100 | cv::imshow("Difference image", differenceImage); 101 | 102 | cv::Mat exclusionImage; 103 | exclusion(imageUp, imageDown, exclusionImage); 104 | exclusionImage.convertTo(exclusionImage, CV_8UC3, 255.0); 105 | cv::imshow("Exclusion image", exclusionImage); 106 | 107 | cv::Mat dissolveImage; 108 | dissolve(imageUp, imageDown, dissolveImage, 0.75f); 109 | dissolveImage.convertTo(dissolveImage, CV_8UC3, 255.0); 110 | cv::imshow("Dissolve image", dissolveImage); 111 | 112 | cv::waitKey(); 113 | return 0; 114 | } 115 | -------------------------------------------------------------------------------- /src/6.RGB2Gray/6.RGB2Gray.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {1A49452F-0F36-4857-889C-B49EFA851CE3} 24 | My6RGB2Gray 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/6.RGB2Gray/6.RGB2Gray.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/6.RGB2Gray/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/38122673 2 | // 彩色图像转灰度图像 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | // 方案一:I = 0.299 * R + 0.587 * G + 0.144 * B 8 | void rgb_2_gray1(const cv::Mat& color, cv::Mat& gray) 9 | { 10 | CV_Assert(color.type() == CV_8UC3); 11 | 12 | gray.create(color.size(), CV_8UC1); 13 | 14 | const int h = color.rows; 15 | const int w = color.cols; 16 | for (int y = 0; y < h; ++y) 17 | { 18 | uchar* grayData = gray.ptr(y); 19 | const cv::Vec3b* colorData = color.ptr(y); 20 | for (int x = 0; x < w; ++x) 21 | { 22 | const cv::Vec3b& c = colorData[x]; 23 | grayData[x] = cv::saturate_cast( 24 | 0.299f * c[2] + 0.587f * c[1] + 0.114f * c[0]); 25 | } 26 | } 27 | } 28 | 29 | // 方案二:I = (R + G + B) / 3 30 | void rgb_2_gray2(const cv::Mat& color, cv::Mat& gray) 31 | { 32 | CV_Assert(color.type() == CV_8UC3); 33 | 34 | gray.create(color.size(), CV_8UC1); 35 | 36 | const int h = color.rows; 37 | const int w = color.cols; 38 | for (int y = 0; y < h; ++y) 39 | { 40 | uchar* grayData = gray.ptr(y); 41 | const cv::Vec3b* colorData = color.ptr(y); 42 | for (int x = 0; x < w; ++x) 43 | { 44 | const cv::Vec3b& c = colorData[x]; 45 | grayData[x] = cv::saturate_cast( 46 | ((float)c[0] + (float)c[1] + (float)c[2]) / 3.0f + 0.5f); 47 | } 48 | } 49 | } 50 | 51 | // 方案三:I = max(R, G, B) 52 | void rgb_2_gray3(const cv::Mat& color, cv::Mat& gray) 53 | { 54 | CV_Assert(color.type() == CV_8UC3); 55 | 56 | gray.create(color.size(), CV_8UC1); 57 | 58 | const int h = color.rows; 59 | const int w = color.cols; 60 | for (int y = 0; y < h; ++y) 61 | { 62 | uchar* grayData = gray.ptr(y); 63 | const cv::Vec3b* colorData = color.ptr(y); 64 | for (int x = 0; x < w; ++x) 65 | { 66 | const cv::Vec3b& c = colorData[x]; 67 | grayData[x] = std::max(c[0], std::max(c[1], c[2])); 68 | } 69 | } 70 | } 71 | 72 | int main() 73 | { 74 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 75 | if (colorImage.empty()) 76 | { 77 | return -1; 78 | } 79 | 80 | cv::imshow("Color image", colorImage); 81 | 82 | cv::Mat grayImage1; 83 | rgb_2_gray1(colorImage, grayImage1); 84 | cv::imshow("Gray Image 1", grayImage1); 85 | 86 | cv::Mat grayImage2; 87 | rgb_2_gray2(colorImage, grayImage2); 88 | cv::imshow("Gray image 2", grayImage2); 89 | 90 | cv::Mat grayImage3; 91 | rgb_2_gray3(colorImage, grayImage3); 92 | cv::imshow("Gray image 3", grayImage3); 93 | 94 | cv::waitKey(); 95 | return 0; 96 | } 97 | -------------------------------------------------------------------------------- /src/7.RGBSplit/7.RGBSplit.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {9A4FB5A1-5F04-497D-8493-C4BAF1CEDF7C} 24 | My7RGBSplit 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/7.RGBSplit/7.RGBSplit.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/7.RGBSplit/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/39896567 2 | // RGB三通道分离 3 | #include 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | int main() 9 | { 10 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 11 | if (colorImage.empty()) 12 | { 13 | return -1; 14 | } 15 | 16 | cv::imshow("Color image", colorImage); 17 | 18 | std::vector vecBGR; 19 | cv::split(colorImage, vecBGR); 20 | cv::Mat R = vecBGR[2]; 21 | cv::Mat G = vecBGR[1]; 22 | cv::Mat B = vecBGR[0]; 23 | cv::imshow("R channel", R); 24 | cv::imshow("G channel", G); 25 | cv::imshow("B channel", B); 26 | 27 | cv::waitKey(); 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /src/8.ColorComputation/8.ColorComputation.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {AD8F627A-A02D-4430-8941-02392BB5B123} 24 | My8ColorComputation 25 | 10.0.16299.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v141 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v141 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v141 45 | MultiByte 46 | 47 | 48 | Application 49 | false 50 | v141 51 | true 52 | MultiByte 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Level3 78 | Disabled 79 | true 80 | 81 | 82 | 83 | 84 | Level3 85 | Disabled 86 | true 87 | 88 | 89 | 90 | 91 | Level3 92 | MaxSpeed 93 | true 94 | true 95 | true 96 | 97 | 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | MaxSpeed 106 | true 107 | true 108 | true 109 | 110 | 111 | true 112 | true 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /src/8.ColorComputation/8.ColorComputation.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/8.ColorComputation/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40263809 2 | // 颜色运算 3 | #include 4 | #include "opencv2/core/core.hpp" 5 | #include "opencv2/highgui/highgui.hpp" 6 | #include "opencv2/imgproc/imgproc.hpp" 7 | 8 | void color_computation(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | std::vector vecBGR; 13 | cv::split(src, vecBGR); 14 | cv::Mat B = vecBGR[0]; 15 | cv::Mat G = vecBGR[1]; 16 | cv::Mat R = vecBGR[2]; 17 | 18 | const float alpha = 0.15f; 19 | 20 | cv::Mat dstB = B * alpha / (R + G + 0.001f); 21 | cv::Mat dstG = G * alpha / (R + B + 0.001f); 22 | cv::Mat dstR = R * alpha / (B + G + 0.001f); 23 | 24 | std::vector vecDstBGR; 25 | vecDstBGR.push_back(dstB); 26 | vecDstBGR.push_back(dstG); 27 | vecDstBGR.push_back(dstR); 28 | cv::merge(vecDstBGR, dst); 29 | } 30 | 31 | int main() 32 | { 33 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 34 | if (colorImage.empty()) 35 | { 36 | return -1; 37 | } 38 | 39 | cv::imshow("Color image", colorImage); 40 | 41 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 42 | 43 | cv::Mat resultImage; 44 | color_computation(colorImage, resultImage); 45 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 46 | cv::imshow("Result image", resultImage); 47 | 48 | cv::waitKey(); 49 | return 0; 50 | } 51 | -------------------------------------------------------------------------------- /src/9.PSFilterDebrisEffects/9.PSFilterDebrisEffects.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/9.PSFilterDebrisEffects/main.cpp: -------------------------------------------------------------------------------- 1 | // http://blog.csdn.net/matrix_space/article/details/40477085 2 | // PS滤镜:碎片特效 3 | #include "opencv2/core/core.hpp" 4 | #include "opencv2/highgui/highgui.hpp" 5 | #include "opencv2/imgproc/imgproc.hpp" 6 | 7 | // 碎片特效 8 | void debris_effects(const cv::Mat& src, cv::Mat& dst) 9 | { 10 | CV_Assert(src.type() == CV_32FC3); 11 | 12 | cv::Mat imageUp = src.clone(); 13 | cv::Mat imageDown = src.clone(); 14 | cv::Mat imageLeft = src.clone(); 15 | cv::Mat imageRight = src.clone(); 16 | 17 | const int offset = 5; 18 | const int h = src.rows; 19 | const int w = src.cols; 20 | 21 | cv::Mat tempSrc; 22 | cv::Mat tempDst; 23 | 24 | // down 25 | tempSrc = src.rowRange(0, h - 1 - offset); 26 | tempDst = imageDown.rowRange(offset, h - 1); 27 | tempSrc.copyTo(tempDst); 28 | 29 | // up 30 | tempSrc = src.rowRange(offset, h - 1); 31 | tempDst = imageUp.rowRange(0, h - 1 - offset); 32 | tempSrc.copyTo(tempDst); 33 | 34 | // left 35 | tempSrc = src.colRange(offset, w - 1); 36 | tempDst = imageLeft.colRange(0, w - 1 - offset); 37 | tempSrc.copyTo(tempDst); 38 | 39 | // right 40 | tempSrc = src.colRange(0, w - 1 - offset); 41 | tempDst = imageRight.colRange(offset, w - 1); 42 | tempSrc.copyTo(tempDst); 43 | 44 | dst = 0.25f * (imageUp + imageDown + imageLeft + imageRight); 45 | } 46 | 47 | int main() 48 | { 49 | cv::Mat colorImage = cv::imread("../../dataset/flower.jpg"); 50 | if (colorImage.empty()) 51 | { 52 | return -1; 53 | } 54 | 55 | cv::imshow("Color image", colorImage); 56 | 57 | colorImage.convertTo(colorImage, CV_32FC3, 1.0 / 255.0); 58 | 59 | cv::Mat resultImage; 60 | debris_effects(colorImage, resultImage); 61 | resultImage.convertTo(resultImage, CV_8UC3, 255.0); 62 | cv::imshow("Result image", resultImage); 63 | 64 | cv::waitKey(); 65 | return 0; 66 | } 67 | --------------------------------------------------------------------------------