项目需求是做图像增强处理,完成了图像增强的算法后,我没法区分几种算法结论之间的好坏之分,肉眼越来越难以识别,于是想到通过评价函数来评价,试验了以下几种方法,处理图像为16位的灰度图。(本篇博文为作者项目笔记,不具有严谨的科学论证,主要记录之用)
先上待处理的原图,前两张其实是一张图像,后一张为增强后的图像,65536像素图像显示到屏幕必须要调窗显示,第一张窗宽我调的大些,第二张调节到显示细节的像素区域。很明显在16位的像素区域,图像的像素方差还是比较大的,这个信噪比估计也是大的。下面做试验了,验证原图和处理后的图像哪个信噪比大。
峰值性噪比公式如下,MSE为图像的方差,
Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,理论上来说同一场景下梯度值越高,图像越清晰,这里用sobel计算图像的平均灰度值。
double imagePro::qualityOfImage(Mat src, double &psnr)
{
Mat mean;
Mat stddev;
meanStdDev(src,mean , stddev);
psnr = 20 * log10(MAXPIXEL / stddev.at<double>(0, 0));
return psnr;
}
int imagePro::RawToMat(const char fileName[], cv::Mat& dst,const int height,const int width)
{
if (fileName == nullptr) return 0;
if ((width <= 0) | (height <= 0)) return 0;
size_t nsize = width * height;
unsigned short *data = new unsigned short[nsize];
FILE *file;
file = fopen(fileName, "rb+");
fread(data, sizeof(unsigned short), nsize, file);
fclose(file);
cv::Mat temp(height, width, CV_16UC1, data);
dst = temp.clone();
return 0;
}
int main()
{
imagePro img;
Mat src,src2;
char strPath[256] = "data/12.raw";
char strPath2[256] = "data/12_.raw";
int height = HEIGHT;
int width = WIDTH;
img.RawToMat(strPath, src, height, width);
img.RawToMat(strPath2, src2, height, width);
double pnsr = 0.0;
//图像峰值信噪比
img.qualityOfImage(~src, pnsr);
cout << pnsr << end;
img.qualityOfImage(src2, pnsr);
cout << pnsr << endl;
//梯度
Mat imageSobel, imageSobel2,imageSobel3;
Sobel(src, imageSobel, CV_16U, 1, 1);
Sobel(src2, imageSobel2, CV_16U, 1, 1);
double meanValue = 0.0;
meanValue = mean(imageSobel)[0];
cout << meanValue << endl;
meanValue = mean(imageSobel2)[0];
cout << meanValue << endl;
Mat sharp = src2 + imageSobel2;
//img.saveRawFile("data/sharp.raw",sharp);
Sobel(sharp, imageSobel3, CV_16U, 1, 1);
meanValue = mean(imageSobel3)[0];
cout << meanValue << endl;
}
结果:
21.0854 ---1
14.4128 ---2
45.3035 ---3
61.993 ---4
97.8653 ---5
结论与估计:
1、对比前两个数值,性噪比与理论上相反,故不适用;
2、对比3,4,5数值,梯度方法有用;
3、对比4,5 ,5为在4的基础上添加了一次基于梯度的增强,数值确实增加了,但是对比显示出来的图像没什么变化,估计就是这是一个综合问题,单一的评价系数不能精确衡量显示出来图像的质量,没有精细比较的价值,可能就是调窗方法导致的。
4、另外做了一个实验,将A、B两幅同一物体图像,其余不变,其中A为细边缘,B为粗边缘,其中A图像梯度质量图像高于B。如下
结果:
14.4128
15.4068
61.993
62.6221
98.7929