Skip to content

Commit 9ff7f2a

Browse files
committed
Add PS模糊滤镜之水波效果算法.cpp
1 parent 9c864e6 commit 9ff7f2a

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const double pi = acos(-1.0);
2+
Mat WaveFilter(Mat src) {
3+
int row = src.rows;
4+
int col = src.cols;
5+
float A = 7;
6+
float B = 2.5;
7+
Point Center(col / 2, row / 2);
8+
Mat dst(row, col, CV_8UC3);
9+
for (int y = 0; y < row; y++) {
10+
for (int x = 0; x < col; x++) {
11+
float y0 = Center.y - y;
12+
float x0 = x - Center.x;
13+
float theta = atan(y0 / (x0 + 0.00001));
14+
if (x0 < 0)
15+
theta = theta + pi;
16+
float r0 = sqrt(x0*x0 + y0*y0);
17+
float r1 = r0 + A * col * 0.01 * sin(B * 0.1 * r0);
18+
19+
float new_x = r1 * cos(theta);
20+
float new_y = r1 * sin(theta);
21+
22+
new_x = Center.x + new_x;
23+
new_y = Center.y + new_y;
24+
25+
if (new_x < 0) new_x = 0;
26+
if (new_x >= col - 1) new_x = col - 2;
27+
if (new_y < 0) new_y = 0;
28+
if (new_y >= row - 1) new_y = row - 2;
29+
int x1 = (int)new_x;
30+
int y1 = (int)new_y;
31+
float p = new_x - x1;
32+
float q = new_y - y1;
33+
for (int k = 0; k < 3; k++) {
34+
dst.at<Vec3b>(y, x)[k] = (1 - p)*(1 - q)*src.at<Vec3b>(y1, x1)[k] + (p)*(1 - q)*src.at<Vec3b>(y1, x1 + 1)[k] +
35+
(1 - p)*(q)*src.at<Vec3b>(y1 + 1, x1)[k] + (p)*(q)*src.at<Vec3b>(y1 + 1, x1 + 1)[k];
36+
}
37+
}
38+
}
39+
return dst;
40+
}

PhotoShop Algorithm/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@
3333
- PS色彩平衡(偏色校正).cpp 根据用户指定的R、G、B三个色彩的调整分量,分别附加到对应的色彩分量上,从而改变原始图像的色彩。
3434
- PS图像素描算法.cpp 原理就是图像去色后转置,然后接高斯滤波,最后对去色的图和模糊的图进行图层混合。
3535
- PS模糊滤镜之表面模糊算法.cpp 其作用是在保留图像边缘的情况下,对图像的表面进行模糊处理,效果比双边滤波好。
36+
- PS模糊滤镜之水波效果算法.cpp 这个算法原理不清楚,最先出处是这个博客:https://blog.csdn.net/matrix_space/article/details/42396829 。但他也没说明原理,还需研究下。
3637

0 commit comments

Comments
 (0)