Image 如何在JavaCV中实现PSNR? 我发现在C++中用OpenCV实现PSNR,但是在JavaCV中实现这一点有困难。
Image 如何在JavaCV中实现PSNR? 我发现在C++中用OpenCV实现PSNR,但是在JavaCV中实现这一点有困难。,image,opencv,computer-vision,match,javacv,Image,Opencv,Computer Vision,Match,Javacv,double getPSNR(常数矩阵和I1、常数矩阵和I2) { 垫s1; absdiff(I1,I2,s1);/| I1-I2| s1.convertTo(s1,CV_32F);//不能在8位上生成正方形 s1=s1.mul(s1);//I1-I2^2 标量s=sum(s1);//对每个通道的元素求和 双sse=s.val[0]+s.val[1]+s.val[2];//和通道 如果(sse在本例中,Mat是来自图像的RGB值数组。 本例中的标量是由3个数字组成的列表 absdiff(I1,I
double getPSNR(常数矩阵和I1、常数矩阵和I2)
{
垫s1;
absdiff(I1,I2,s1);/| I1-I2|
s1.convertTo(s1,CV_32F);//不能在8位上生成正方形
s1=s1.mul(s1);//I1-I2^2
标量s=sum(s1);//对每个通道的元素求和
双sse=s.val[0]+s.val[1]+s.val[2];//和通道
如果(sse在本例中,Mat是来自图像的RGB值数组。
本例中的标量是由3个数字组成的列表
absdiff(I1,I2,s1)的意思是从第一幅图像(I1)中提取一个像素,该图像具有颜色/灰度/rgba通道ect,并从图像2中的像素(I2)中减去该像素,获取差值的绝对值,然后将其存储在分配的矩阵/数组(s1)中作为第一个元素。如果你有一个rgb图像,你会得到绝对差| R1-R2 |,| G1-G2 |,| B1-B2 |,并存储这3个值,其中1来自图像1,2来自图像2,对所有像素都这样做
sum(s1)的意思是,在s1中存储两幅图像的颜色差异,求和所有红色值,求和所有蓝色值,求和所有绿色值,并返回一个包含3个数字的列表,代表每种颜色的总数
只要用YMK或任何你可能正在使用的东西来替换RGB
有关基本类型(包括矩阵和标量)的更多信息,请参见以下opencv文档:在该文件和目录附近可以找到一些代码:
“Mat类代表一个2D数值数组,可以作为矩阵(进一步称为矩阵)、图像、光流图等。它与OpenCV早期版本的CvMat类型非常相似,与CvMat类似,矩阵可以是多通道的,但它也完全支持ROI机制,就像IplImage一样。”我遇到了同样的问题,并用JavaCV将上述代码翻译成Java。以下是我的代码:
private static double getPSNR(CvMat I1,CvMat I2){
CvMat s1=CvMat.create(I1.rows()、I1.cols()、I1.depth()、I1.nchannes());//创建与I1大小相同的矩阵
cvAbsDiff(I1,I2,s1);/| I1-I2|
CvMat s1_squared=cvCreateMat(s1.rows(),s1.cols(),CV_32FC3);//将mat转换为32位和3个通道
cvMul(s1,s1,s1_平方,1);/| I1-I2 |^2
CvScalar scalar=cvSum(s1_平方);//每个通道的元素总和
double sse=scalar.getVal(0)+scalar.getVal(1)+scalar.getVal(2);//和通道
双mse=sse/(双)(s1.channels()*s1.total());
双峰值信噪比=10.0*数学对数10((255*255)/mse);
返回峰值信噪比;
}
double getPSNR(const Mat& I1, const Mat& I2)
{
Mat s1;
absdiff(I1, I2, s1); // |I1 - I2|
s1.convertTo(s1, CV_32F); // cannot make a square on 8 bits
s1 = s1.mul(s1); // |I1 - I2|^2
Scalar s = sum(s1); // sum elements per channel
double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels
if( sse <= 1e-10) // for small values return zero
return 0;
else
{
double mse =sse /(double)(I1.channels() * I1.total());
double psnr = 10.0*log10((255*255)/mse);
return psnr;
}
}