logo资料库

tv模型原理与c++实现全变分.docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
全变分(TV)模型原理与C++实现
本文介绍了TV模型的基本原理,并给出了C++代码实现。
一、TV模型原理
全变分(TV)模型原理与 C++实现 本文介绍了 TV 模型的基本原理,并给出了 C++代码实现。 一、TV 模型原理
二、C++实现 关于 Matlab 的程序实现,有一个经典的主 页: http://visl.technion.ac.il/~gilboa/PDE-filt/tv_denoising.html 有博主改成了 C++代码:见经典的变分法图像去噪的 C++实现 另有博主改成了更简洁的版本:见【图像处理】全分发 TV 图像去噪 但精简版的有个问题: image[i][j] += dt*(tmp_num/tmp_den+ lam*(image0[i][j] - image[ i][j])); 直接在 image 中迭代,这有问题,最后得到的去噪图像跟 MATLAB 得到的去噪图 像有细微差别,对两幅图像做差值可发现差别。 本文代码基本参照上面的版本,把代码修改为(之前公式有误,已修改 2015 年 4 月 23 日): 1. void CImageObj::Total_Variation(int iter, double dt, double epsilon, double lambda) 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. int i, j; int nx = m_width, ny = m_height; double ep2 = epsilon * epsilon; 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] = (double)m_imgData[i][j]; for (int t = 0; t < iter; t++) { for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) {
19. 20. 界处理 = i; = 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 if (0 == j) jLeft = j; if (nx - 1 == j) jRight 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. I_t[i][jLeft]) / 2.0; I_t[iUp][j]) / 2.0; I_t[i][jLeft] - 2 * I_t[i][j]; - 2 * I_t[i][j]; double tmp_x = (I_t[i][jRight] - double tmp_y = (I_t[iDown][j] - double tmp_xx = I_t[i][jRight] + double tmp_yy = I_t[iDown][j] + I_t[iUp][j] double tmp_xy = (I_t[iDown][jRight] + I_t[iUp][jLeft] - I_t[iUp][jRight] - I_t[iDown][jLeft]) / 4.0; ep2) + tmp_xx * (tmp_y * tmp_y + ep2) - 2 * tmp_x * tmp_y * tmp_xy; double tmp_num = tmp_yy * (tmp_x * tmp_x + double tmp_den = pow(tmp_x * tmp_x + tmp_y * tmp_y + ep2, 1.5); I_tmp[i][j] += dt*(tmp_num / tmp_den + lambda*(m_imgData[i][j] - I_t[i][j])); } } // 一次迭代 for (i = 0; i < ny; i++) for (j = 0; j < nx; j++) { I_t[i][j] = I_tmp[i][j]; } } // 迭代结束 // 给图像赋值
45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.} 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);
分享到:
收藏