/***********************************
*功能 -- 各项异性扩散滤波
*by 垚
*visual studio 2010 & windows 7 ultimalte
************************************/
#include <opencv2\core\core.hpp>
void anisotropic_diffusion(cv::Mat &out, cv::Mat &in, int k, float lambda)
{
int i, j;
int iter = 20;
int nRow = in.rows, nCol = in.cols;
float ei, si, wi, ni;
float ce, cs, cw, cn;
cv::Mat tmp = in.clone();
unsigned char *pin = in.data;
unsigned char *ptmp = tmp.data;
unsigned char *pout = out.data;
for(int n = 0; n < iter; n++)
{
for(i = 1; i < nRow-1; i ++)
for(j = 1; j < nCol-1; j++)
{
float cur = ptmp[i*nCol + j];
ei = ptmp[(i-1)*nCol + j] - cur;
si = ptmp[i*nCol + j + 1] - cur;
wi = ptmp[(i+1)*nCol + j] - cur;
ni = ptmp[i*nCol + j - 1] - cur;
ce = exp(-ei*ei/(k*k));
cs = exp(-si*si/(k*k));
cw = exp(-wi*wi/(k*k));
cn = exp(-ni*ni/(k*k));
pout[i*nCol + j] = cur + lambda*(ce*ei + cs*si + cw*wi + cn*ni);
}
out.copyTo(tmp);
}
}
各项异性扩散滤波 -- OpenCV实现
最新推荐文章于 2021-08-06 23:41:07 发布