├── .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 |
--------------------------------------------------------------------------------