CV模型论文公式转换代码

cv模型能量函数:

又可写成:

C1、C2公式:

代码:

mu=1;nu=0.003 * 255 * 255;epison=1;step=0.1;pi=3.14159265;

 

//Img:原图 LSF:生成图

 

Mat Drc = (epison / pi) / (epison*epison+ LSF.mul(LSF)); //Dirac 函数

//mul函数:mul会计算两个Mat矩阵对应位的乘积,所以要求参与运算的矩阵A的行列和B的行列数一致。计算结果是跟A或B行列数一致的一个Mat矩阵。

 

Mat Hea = 0.5*(1 + (2 / pi)*atan(LSF/epison)); //Heaviside 函数

//atan:自定义函数计算矩阵的反三角函数

 

Mat Length = nu*Drc.mul(cur);

 

Mat Lap;

Laplacian(LSF, Lap, CV_32FC1);//Laplacian调和算子

Mat Penalty = mu*(Lap - cur);

 

Scalar S1;//Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。如果使用的图像是1通道的,则s.val[0]中存储数据;如果使用的图像是3通道的,则s.val[0],s.val[1],s.val[2]中存储数据。

S1 = sum(Hea.mul(Img));

Scalar S2;

S2 = sum(Hea);

float C1 = S1.val[0] / S2.val[0];

Scalar S3;

S3 = sum((1 - Hea).mul(Img));

Scalar S4;

S4 = sum((1 - Hea));

float C2 = S3.val[0] / S4.val[0];

Mat CVterm = Drc.mul((-1 * (Img - C1).mul(Img - C1) + 1 * (Img - C2).mul(Img - C2)));

 

//三项相加

LSF = LSF + step*(Length + Penalty + CVterm);