ssim in c# (opencvsharp)

最近一直在做一个电脑屏幕内容的识别软件(具体内容后面的post再说),需要进行屏幕相同位置、不同时间点的截屏比对,进行判断该位置是否发生了改变。于是用到了opencvsharp和ssim。经过一番网上搜索,发现还没有C#版的ssim,特此把代码分享到这里,希望能帮到有缘人。

public class SSIMResult
    {
        public double score {
            get
            {
                return (mssim.Val0 + mssim.Val1 + mssim.Val2) / 3;
            }
        }
        public Scalar mssim;
        public Mat diff;
    }


public static SSIMResult getMSSIM(Mat i1, Mat i2)
        {
            const double C1 = 6.5025, C2 = 58.5225;
            /***************************** INITS **********************************/
            MatType d = MatType.CV_32F;

            Mat I1 = new Mat(), I2 = new Mat();
            i1.ConvertTo(I1, d);           // cannot calculate on one byte large values
            i2.ConvertTo(I2, d);

            Mat I2_2 = I2.Mul(I2);        // I2^2
            Mat I1_2 = I1.Mul(I1);        // I1^2
            Mat I1_I2 = I1.Mul(I2);        // I1 * I2

            /***********************PRELIMINARY COMPUTING ******************************/

            Mat mu1 = new Mat(), mu2 = new Mat();   //
            Cv2.GaussianBlur(I1, mu1, new OpenCvSharp.Size(11, 11), 1.5);
            Cv2.GaussianBlur(I2, mu2, new OpenCvSharp.Size(11, 11), 1.5);

            Mat mu1_2 = mu1.Mul(mu1);
            Mat mu2_2 = mu2.Mul(mu2);
            Mat mu1_mu2 = mu1.Mul(mu2);

            Mat sigma1_2 = new Mat(), sigma2_2 = new Mat(), sigma12 = new Mat();

            Cv2.GaussianBlur(I1_2, sigma1_2, new OpenCvSharp.Size(11, 11), 1.5);
            sigma1_2 -= mu1_2;

            Cv2.GaussianBlur(I2_2, sigma2_2, new OpenCvSharp.Size(11, 11), 1.5);
            sigma2_2 -= mu2_2;

            Cv2.GaussianBlur(I1_I2, sigma12, new OpenCvSharp.Size(11, 11), 1.5);
            sigma12 -= mu1_mu2;

            / FORMULA 
            Mat t1, t2, t3;

            t1 = 2 * mu1_mu2 + C1;
            t2 = 2 * sigma12 + C2;
            t3 = t1.Mul(t2);              // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))

            t1 = mu1_2 + mu2_2 + C1;
            t2 = sigma1_2 + sigma2_2 + C2;
            t1 = t1.Mul(t2);               // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))

            Mat ssim_map = new Mat();
            Cv2.Divide(t3, t1, ssim_map);      // ssim_map =  t3./t1;

            Scalar mssim = Cv2.Mean(ssim_map);// mssim = average of ssim map



            SSIMResult result = new SSIMResult();
            result.diff = ssim_map;
            result.mssim = mssim;


            return result;
        }

SSIMResult作为ssim的结果,包括3个member variables:

diff : 这是两幅图片的对比差异,32F,取值在-1和1之间

mssim :是BGRA四个通道的差异值,0-1,约接近1越相近

score : 是BGR三个通道差异值的平均,作为两个图片的整体差异值

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: OpencvSharp是一个开源的计算机视觉库,它提供了许多图像处理和计算机视觉算法。要计算相似度,可以使用OpencvSharp中的几个功能。 首先,可以使用OpencvSharp中的函数计算图像的直方图。直方图是图像中像素强度分布的统计信息。通过比较两个图像的直方图,可以判断它们在颜色或灰度上的相似度。 其次,可以使用OpencvSharp中的函数计算图像的结构相似性指数(SSIM)。SSIM是一种衡量图像质量的方法,它计算了亮度、对比度和结构三个方面的相似度。通过比较两个图像SSIM值,可以得出它们的相似度分数。 还可以使用OpencvSharp中的函数计算图像的均方差(MSE)。MSE衡量了两个图像之间像素强度的差异。通过计算两个图像的像素值之差的平方,并求平均值,可以得到它们之间的MSE值。MSE越小,表示两个图像越相似。 除了上述方法,还可以使用OpencvSharp中的函数计算图像的结构相似度指数(PSNR)。PSNR是一种衡量图像失真程度的指标,它将图像的MSE值转化为对数刻度,并计算出表示图像质量的PSNR值。PSNR越高,表示图像质量越好,相似度也就越高。 综上所述,OpencvSharp提供了多种方法来计算图像相似度。根据具体的需求和应用场景,选择合适的方法进行相似度的计算。 ### 回答2: OpenCvSharp是一个基于OpenCV的开源计算机视觉库,它提供了各种图像处理和计算机视觉算法。要计算两个图像相似度,可以使用OpenCVSharp中的几个函数和方法。 首先,可以使用OpenCvSharp加载两个图像,并将它们转换为相同的颜色空间,例如灰度图像。然后,可以使用OpenCVSharp中的函数计算两个图像的差异。常用的方法是平方差法和相关系数。 平方差法是通过计算两个图像像素之差的平方来衡量它们的相似度。相关系数则是通过计算两个图像之间的协方差来衡量它们的相似度。相关系数的取值范围为-1到1,接近1表示两个图像高度相似,接近-1表示它们高度不相似。 接下来,可以根据得到的相似度值进行进一步的处理。例如,可以设置一个阈值,当相似度超过该阈值时,认为两个图像相似。还可以使用其他的图像匹配算法,如特征匹配或基于深度学习的方法,来进一步提高相似度的准确性。 总之,使用OpenCvSharp可以方便地计算两个图像相似度,并根据需要进行进一步的处理和操作。 ### 回答3: OpenCvSharp是一个基于OpenCV的开源计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数和类。要计算相似度,可以使用OpenCvSharp中的一些函数和算法。 首先,可以使用OpenCvSharp中的函数读取两个图像。可以使用`Cv2.ImRead`函数读取图像文件,并将其存储在`Mat`对象中。 接下来,可以使用`Cv2.CompareHist`函数计算两个图像的直方图相似度。该函数需要两个参数,分别是要比较的两个图像的直方图,以及相似度度量的方法。常用的方法包括相关性、卡方、交叉熵等。该函数的返回值是一个0到1之间的相似度得分,值越接近1表示两个图像越相似。 除了直方图相似度,还可以使用OpenCvSharp中的其他函数和算法计算图像相似度。例如,可以使用`Cv2.MatchTemplate`函数进行模板匹配,该函数将模板图像与目标图像进行比较,返回一个匹配结果图像,其中亮度表示匹配程度。可以使用该函数找到目标图像中与模板图像最相似的区域。 此外,OpenCvSharp还提供了一些其他的函数和类,用于特征提取、特征匹配和图像分类等任务。可以根据具体的应用场景选择适合的函数和算法来计算图像相似度。 总而言之,使用OpenCvSharp可以方便地计算图像相似度。根据具体的需求,可以选择不同的函数和算法来完成相应的计算任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值