Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何在JavaCV中实现PSNR? 我发现在C++中用OpenCV实现PSNR,但是在JavaCV中实现这一点有困难。_Image_Opencv_Computer Vision_Match_Javacv - Fatal编程技术网

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;
 }
}