复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67void CImageObj::Perona_Malik(int iter, double dt, double kappa, int option) { int i, j; int nx = m_width, ny = m_height; double** I_t = NewDoubleMatrix(nx, ny); double** I_tmp = NewDoubleMatrix(nx, ny); for (i = 0; i < ny; i++) for (j = 0; j < nx; j++) I_t[i][j] = I_tmp[i][j] = m_imgData[i][j]; for (int t = 0; t < iter; t++) { for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { int iUp = i - 1, iDown = i + 1; int jLeft = j - 1, jRight = j + 1; // 边界处理 if (0 == i) iUp = i; if (ny - 1 == i) iDown = i; if (0 == j) jLeft = j; if (nx - 1 == j) jRight = j; double deltaN = I_t[iUp][j] - I_t[i][j]; double deltaS = I_t[iDown][j] - I_t[i][j]; double deltaE = I_t[i][jRight] - I_t[i][j]; double deltaW = I_t[i][jLeft] - I_t[i][j]; double cN, cS, cE, cW; if (1 == option) { cN = exp(-(deltaN / kappa) * (deltaN / kappa)); cS = exp(-(deltaS / kappa) * (deltaS / kappa)); cE = exp(-(deltaE / kappa) * (deltaE / kappa)); cW = exp(-(deltaW / kappa) * (deltaW / kappa)); } else if (2 == option) { cN = 1.0 / (1 + (deltaN / kappa) * (deltaN / kappa)); cS = 1.0 / (1 + (deltaS / kappa) * (deltaS / kappa)); cE = 1.0 / (1 + (deltaE / kappa) * (deltaE / kappa)); cW = 1.0 / (1 + (deltaW / kappa) * (deltaW / kappa)); } I_tmp[i][j] += dt * (cN * deltaN + cS * deltaS + cE * deltaE + cW * deltaW); } } // 一次迭代 for (i = 0; i < ny; i++) for (j = 0; j < nx; j++) { I_t[i][j] = I_tmp[i][j]; } } // 迭代结束 // 给图像赋值 for (i = 0; i < ny; i++) for (j = 0; j < nx; j++) { double tmp = I_t[i][j]; tmp = max(0, min(tmp, 255)); m_imgData[i][j] = (unsigned char)tmp; } DeleteDoubleMatrix(I_t, nx, ny); DeleteDoubleMatrix(I_tmp, nx, ny); }
最后
以上就是安详缘分最近收集整理的关于PM模型—opencv的全部内容,更多相关PM模型—opencv内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复