#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include <vector>
#include <iostream>
#include <math.h>
#define PI 3.1415927
using namespace std;
using namespace cv;
double HueAngle(double a, double b)
{
/*float h = 0;*/
double hab = 0;
double h = (180.0f / PI)*atan(b / a);
if (a > 0 && b > 0)
{
hab = h;
}
else if (a < 0 && b > 0)
{
hab = 180 + h;
}
else if (a < 0 && b < 0)
{
hab = 180 + h;
}
else
{
hab = 360 + h;
}
return hab;
}
double ColorDegree(double a, double b)
{
double Cab = pow(a*a + b*b, 0.5f);
return Cab;
}
int _tmain(int argc, _TCHAR* argv[])
{
Mat img1, img2;
Mat lab1, lab2;
img1 = imread("D:\\1.png");
img2 = imread("D:\\18.png");
cvtColor(img1, lab1, CV_BGR2Lab, 3);
cvtColor(img2, lab2, CV_BGR2Lab, 3);
resize(lab2, lab2, Size(lab1.cols, lab1.rows));
double l1, a1, b1, l2, a2, b2, Cab1, Cab2, aveCab;
double G, l11, a11, b11, l21, a21, b21, L12, Cab12, Hab, hab1, hab2, Cab11, Cab21, aveL12, aveCab12, SL, SC;
double hab12, T, SH, RC, W, RT;
double t = 0.5;
double E, sumL1 = 0, sumL2 = 0, sumA1 = 0, sumA2 = 0, sumB1 = 0, sumB2 = 0, aveL1, aveA1, aveB1, aveL2, aveA2, aveB2;
//float sumE = 0.f;
for (int i = 0; i < lab1.rows; i++)
{
uchar* p1 = lab1.ptr<uchar>(i);
uchar* p2 = lab2.ptr<uchar>(i);
for (int j = 0; j < lab1.cols; j++)
{
l1 = p1[3 * j + 0];//获取像素数
a1 = p1[3 * j + 1];
b1 = p1[3 * j + 2];
sumL1 += l1;
sumA1 += a1;
sumB1 += b1;
l2 = p2[3 * j + 0];
a2 = p2[3 * j + 1];
b2 = p2[3 * j + 2];
sumL2 += l2;
sumA2 += a2;
sumB2 += b2;
}
}
aveL1 = sumL1 / (lab1.cols*lab1.rows);//图1 L通道像素的平均数
aveA1 = sumA1 / (lab1.cols*lab1.rows);//图1 a通道像素的平均数
aveB1 = sumB1 / (lab1.cols*lab1.rows);//图1 b通道像素的平均数
aveL2 = sumL2 / (lab2.cols*lab2.rows);//图2 L通道像素的平均数
aveA2 = sumA2 / (lab2.cols*lab2.rows);//图2 a通道像素的平均数
aveB2 = sumB2 / (lab2.cols*lab2.rows);//图2 b通道像素的平均数
cout << "aveL1=" << aveL1 << " aveA1=" << aveA1 << " aveB1=" << aveB1 << " aveL2=" << aveL2 << " aveA2=" << aveA2 << " aveB2=" << aveB2 << endl;
Cab1 = (double)ColorDegree(aveA1, aveB1);//计算心理彩度
Cab2 = (double)ColorDegree(aveA2, aveB2);
cout << "Cab1=" << Cab1 << " Cab2=" << Cab2 << endl;
aveCab = (double)((Cab1 + Cab2) / 2.0);//心理彩度平均值
//Mab = pow(aveCab, 7);
G = (double)(t*(1 - sqrt(pow(aveCab, 7) / (pow(aveCab, 7) + pow(25, 7)))));//计算调节因子G
cout << "G=" << G << endl;
l11 = aveL1;//计算L1'
a11 = (1 + G)*aveA1;//计算a1'
b11 = aveB1;//计算b1'
hab1 = (double)(HueAngle(a11, b11));//图1色调hab'
cout << "hab1=" << hab1 << endl;
l21 = aveL2;//计算L2'
a21 = (double)((1.0 + G)*aveA2); //计算a2'
b21 = aveB2;//计算b2'
hab2 = (double)(HueAngle(a21, b21));//图2色调hab'
cout << "hab1=" << hab2 << endl;
Cab11 = (double)ColorDegree(a11, b11);
Cab21 = (double)ColorDegree(a21, b21);
L12 = l11 - l21;//计算明度差
Cab12 = Cab11 - Cab21;//彩度差
hab12 = hab1 - hab2;
Hab = (double)(2.0*((sqrt(Cab11*Cab21))*sin(hab12*PI / 360)));/相度差
cout << "L12=" << L12 << " Cab12=" << Cab12 << " Hab=" << Hab << endl;
aveL12 = (double)((l11 + l21) / 2.0);
aveCab12 = (Cab11 + Cab21)*t;
SL = (double)((((0.015*(pow((aveL12 - 50.0), 2) / sqrt(20.0 + pow((aveL12 - 50), 2)))))) + 1.0);//权重函数SL
SC = (double)(1.0 + 0.045*aveCab12);//权重函数SC
T = (double)(1.0 - (0.17*cos(((hab1 + hab2)*t - 30.0)*PI / 180.0f)) + 0.24*cos((2.0 * (hab1 + hab2)*t)*PI / 180.0f) + 0.32*cos((3.0 * (hab1 + hab2)*t + 6.0)*PI / 180.0f) - 0.20*cos((4.0 * (hab1 + hab2)*t - 63.0)*PI / 180.0f));
cout << "T=" << T<< endl;
SH = (double)(1.0 + 0.015*aveCab12*T);//权重函数SH
RC = (double)(2.0 * sqrt(pow(aveCab12, 7) / (pow(aveCab12, 7) + 6103515625.0)));//旋转函数RC
W = (double)(30.0 * exp(-pow((((hab1 + hab2)*t) - 275) / 25, 2))); /*(-(((hab1 + hab2)*t) / 25.0)*(((hab1 + hab2)*t) / 25.0)));*/
cout << "W=" << W << endl;
RT = (double)(-(sin((2.0 * W)*PI / 180))*RC);//旋转函数RT
cout << "SL=" << SL << " SC=" << SC << " SH=" << SH << " RT=" << RT << endl;
E = pow(((L12 / SL)*(L12 / SL) + (Cab12 / SC)*(Cab12 / SC) + (Hab / SH)*(Hab / SH) + RT*(Cab12 / SC)*(Hab / SH)), t);/差值
cout << "E=" << E;//输出色差值
}
#include "opencv2/opencv.hpp"
#include <vector>
#include <iostream>
#include <math.h>
#define PI 3.1415927
using namespace std;
using namespace cv;
double HueAngle(double a, double b)
{
/*float h = 0;*/
double hab = 0;
double h = (180.0f / PI)*atan(b / a);
if (a > 0 && b > 0)
{
hab = h;
}
else if (a < 0 && b > 0)
{
hab = 180 + h;
}
else if (a < 0 && b < 0)
{
hab = 180 + h;
}
else
{
hab = 360 + h;
}
return hab;
}
double ColorDegree(double a, double b)
{
double Cab = pow(a*a + b*b, 0.5f);
return Cab;
}
int _tmain(int argc, _TCHAR* argv[])
{
Mat img1, img2;
Mat lab1, lab2;
img1 = imread("D:\\1.png");
img2 = imread("D:\\18.png");
cvtColor(img1, lab1, CV_BGR2Lab, 3);
cvtColor(img2, lab2, CV_BGR2Lab, 3);
resize(lab2, lab2, Size(lab1.cols, lab1.rows));
double l1, a1, b1, l2, a2, b2, Cab1, Cab2, aveCab;
double G, l11, a11, b11, l21, a21, b21, L12, Cab12, Hab, hab1, hab2, Cab11, Cab21, aveL12, aveCab12, SL, SC;
double hab12, T, SH, RC, W, RT;
double t = 0.5;
double E, sumL1 = 0, sumL2 = 0, sumA1 = 0, sumA2 = 0, sumB1 = 0, sumB2 = 0, aveL1, aveA1, aveB1, aveL2, aveA2, aveB2;
//float sumE = 0.f;
for (int i = 0; i < lab1.rows; i++)
{
uchar* p1 = lab1.ptr<uchar>(i);
uchar* p2 = lab2.ptr<uchar>(i);
for (int j = 0; j < lab1.cols; j++)
{
l1 = p1[3 * j + 0];//获取像素数
a1 = p1[3 * j + 1];
b1 = p1[3 * j + 2];
sumL1 += l1;
sumA1 += a1;
sumB1 += b1;
l2 = p2[3 * j + 0];
a2 = p2[3 * j + 1];
b2 = p2[3 * j + 2];
sumL2 += l2;
sumA2 += a2;
sumB2 += b2;
}
}
aveL1 = sumL1 / (lab1.cols*lab1.rows);//图1 L通道像素的平均数
aveA1 = sumA1 / (lab1.cols*lab1.rows);//图1 a通道像素的平均数
aveB1 = sumB1 / (lab1.cols*lab1.rows);//图1 b通道像素的平均数
aveL2 = sumL2 / (lab2.cols*lab2.rows);//图2 L通道像素的平均数
aveA2 = sumA2 / (lab2.cols*lab2.rows);//图2 a通道像素的平均数
aveB2 = sumB2 / (lab2.cols*lab2.rows);//图2 b通道像素的平均数
cout << "aveL1=" << aveL1 << " aveA1=" << aveA1 << " aveB1=" << aveB1 << " aveL2=" << aveL2 << " aveA2=" << aveA2 << " aveB2=" << aveB2 << endl;
Cab1 = (double)ColorDegree(aveA1, aveB1);//计算心理彩度
Cab2 = (double)ColorDegree(aveA2, aveB2);
cout << "Cab1=" << Cab1 << " Cab2=" << Cab2 << endl;
aveCab = (double)((Cab1 + Cab2) / 2.0);//心理彩度平均值
//Mab = pow(aveCab, 7);
G = (double)(t*(1 - sqrt(pow(aveCab, 7) / (pow(aveCab, 7) + pow(25, 7)))));//计算调节因子G
cout << "G=" << G << endl;
l11 = aveL1;//计算L1'
a11 = (1 + G)*aveA1;//计算a1'
b11 = aveB1;//计算b1'
hab1 = (double)(HueAngle(a11, b11));//图1色调hab'
cout << "hab1=" << hab1 << endl;
l21 = aveL2;//计算L2'
a21 = (double)((1.0 + G)*aveA2); //计算a2'
b21 = aveB2;//计算b2'
hab2 = (double)(HueAngle(a21, b21));//图2色调hab'
cout << "hab1=" << hab2 << endl;
Cab11 = (double)ColorDegree(a11, b11);
Cab21 = (double)ColorDegree(a21, b21);
L12 = l11 - l21;//计算明度差
Cab12 = Cab11 - Cab21;//彩度差
hab12 = hab1 - hab2;
Hab = (double)(2.0*((sqrt(Cab11*Cab21))*sin(hab12*PI / 360)));/相度差
cout << "L12=" << L12 << " Cab12=" << Cab12 << " Hab=" << Hab << endl;
aveL12 = (double)((l11 + l21) / 2.0);
aveCab12 = (Cab11 + Cab21)*t;
SL = (double)((((0.015*(pow((aveL12 - 50.0), 2) / sqrt(20.0 + pow((aveL12 - 50), 2)))))) + 1.0);//权重函数SL
SC = (double)(1.0 + 0.045*aveCab12);//权重函数SC
T = (double)(1.0 - (0.17*cos(((hab1 + hab2)*t - 30.0)*PI / 180.0f)) + 0.24*cos((2.0 * (hab1 + hab2)*t)*PI / 180.0f) + 0.32*cos((3.0 * (hab1 + hab2)*t + 6.0)*PI / 180.0f) - 0.20*cos((4.0 * (hab1 + hab2)*t - 63.0)*PI / 180.0f));
cout << "T=" << T<< endl;
SH = (double)(1.0 + 0.015*aveCab12*T);//权重函数SH
RC = (double)(2.0 * sqrt(pow(aveCab12, 7) / (pow(aveCab12, 7) + 6103515625.0)));//旋转函数RC
W = (double)(30.0 * exp(-pow((((hab1 + hab2)*t) - 275) / 25, 2))); /*(-(((hab1 + hab2)*t) / 25.0)*(((hab1 + hab2)*t) / 25.0)));*/
cout << "W=" << W << endl;
RT = (double)(-(sin((2.0 * W)*PI / 180))*RC);//旋转函数RT
cout << "SL=" << SL << " SC=" << SC << " SH=" << SH << " RT=" << RT << endl;
E = pow(((L12 / SL)*(L12 / SL) + (Cab12 / SC)*(Cab12 / SC) + (Hab / SH)*(Hab / SH) + RT*(Cab12 / SC)*(Hab / SH)), t);/差值
cout << "E=" << E;//输出色差值
}