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);