|
|
|
|
@ -57,12 +57,84 @@ void detect_saturation(cv::Mat input_img, float& satu)
|
|
|
|
|
satu = mean.val[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void detect_graydiff(cv::Mat img, float& CON, float& ASM, float& ENT, float& MEAN)
|
|
|
|
|
{
|
|
|
|
|
Mat mi;
|
|
|
|
|
int row = img.rows;
|
|
|
|
|
int col = img.cols;
|
|
|
|
|
//CON=i*i*P(I)
|
|
|
|
|
//计算i
|
|
|
|
|
mi.create(row, col, img.type());
|
|
|
|
|
for (int i = 0; i < row-1; i++)
|
|
|
|
|
for (int j = 0; j < col; j++)
|
|
|
|
|
{
|
|
|
|
|
//cout << "BEF" << int(img.ptr<uchar>(i)[j]) << endl;
|
|
|
|
|
mi.at<Vec3b>(i, j) = img.at<Vec3b>(i + 1, j) - img.at<Vec3b>(i, j);
|
|
|
|
|
//cout << "IMF:" << int(mi.ptr<uchar>(i)[j]) << endl;
|
|
|
|
|
}
|
|
|
|
|
//计算p(I) 差值的概率
|
|
|
|
|
int new_cols = mi.cols;
|
|
|
|
|
int new_rows = mi.rows;
|
|
|
|
|
int gray[256] = { 0 };
|
|
|
|
|
double gray_prob[256] = { 0 };
|
|
|
|
|
int num = 0;// 像素的总个数
|
|
|
|
|
//统计直方图各个像素灰度值
|
|
|
|
|
for (int i = 0; i < mi.rows; i++)
|
|
|
|
|
{
|
|
|
|
|
uchar *p = mi.ptr<uchar>(i);
|
|
|
|
|
for (int j = 0; j < mi.cols; j++)
|
|
|
|
|
{
|
|
|
|
|
int value = p[j];
|
|
|
|
|
gray[value]++;
|
|
|
|
|
num++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//计算直方图概率分布
|
|
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
|
|
{
|
|
|
|
|
gray_prob[i] = ((double)gray[i] / num);
|
|
|
|
|
}
|
|
|
|
|
CON = 0.0;
|
|
|
|
|
ASM = 0.0;
|
|
|
|
|
ENT = 0.0;
|
|
|
|
|
MEAN = 0.0;
|
|
|
|
|
double v = 1.0/ 255.0;
|
|
|
|
|
for (int i = 0; i <= 255; i++)
|
|
|
|
|
{
|
|
|
|
|
CON += i*i*gray_prob[i];//计算CON
|
|
|
|
|
ASM += gray_prob[i] * gray_prob[i];//计算角度方向二阶矩
|
|
|
|
|
if (gray_prob[i]!=0)
|
|
|
|
|
ENT += (0-gray_prob[i] * log10(gray_prob[i]));//计算熵
|
|
|
|
|
MEAN += v*i*gray_prob[i];//计算平均值
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void detect_definition(cv::Mat input_img, float& sb, float& lap, float& dev)
|
|
|
|
|
{
|
|
|
|
|
Mat imgGray, imgSobel, imgLap, imgDev, meanValueImage;
|
|
|
|
|
cvtColor(input_img, imgGray, CV_BGR2GRAY);
|
|
|
|
|
Sobel(imgGray, imgSobel, CV_16U, 1, 1);
|
|
|
|
|
Laplacian(imgGray, imgLap, CV_16U);
|
|
|
|
|
meanStdDev(imgGray,meanValueImage,imgDev);
|
|
|
|
|
sb = mean(imgSobel)[0];
|
|
|
|
|
lap = mean(imgLap)[0];
|
|
|
|
|
dev = mean(imgDev)[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
Mat img = imread(argv[1]);
|
|
|
|
|
float cast, da, satu;
|
|
|
|
|
detect_brightness(img, cast, da);
|
|
|
|
|
detect_saturation(img, satu);
|
|
|
|
|
cout<<cast<<"||"<<da<<"||"<<satu;
|
|
|
|
|
float cast, da, satu, CON, ASM, ENT, MEAN, sb, lap, dev;
|
|
|
|
|
Mat img_brightness = img.clone();
|
|
|
|
|
detect_brightness(img_brightness, cast, da);
|
|
|
|
|
Mat img_saturation = img.clone();
|
|
|
|
|
detect_saturation(img_saturation, satu);
|
|
|
|
|
Mat img_graydiff = img.clone();
|
|
|
|
|
detect_graydiff(img_graydiff, CON, ASM, ENT, MEAN);
|
|
|
|
|
Mat img_definition = img.clone();
|
|
|
|
|
detect_definition(img_definition, sb, lap, dev);
|
|
|
|
|
cout<<cast<<"||"<<da<<"||"<<satu<<"||"<<CON<<"||"<<ASM<<"||"<<ENT<<"||"<<MEAN<<"||"<<sb<<"||"<<lap<<"||"<<dev;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|