最近在做一个关于颜色色差的项目,自己动手做了一个

#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;//输出色差值


}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值