使用openCV比对任意两张图片的相似度(亲测较准确)

这篇具有很好参考价值的文章主要介绍了使用openCV比对任意两张图片的相似度(亲测较准确)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方案:使用openCV中的直方图算法做对比。测试效果较好。

步骤(在java中使用openCV):

1.引入openCV的依赖

      <!-- https://mvnrepository.com/artifact/org.openimaj/core -->
        <dependency>
            <groupId>org.openpnp</groupId>
            <artifactId>opencv</artifactId>
            <version>4.5.5-1</version>
        </dependency>

2.代码

代码中提供了均方差算法(MSE)、结构相似性指数算法(SSIM)、峰值信噪比(PSNR)、直方图算法。其中直方图效果最好

package com.angus.temp;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.List;
/**
 * @author angus
 * @version 1.0.0
 * @Description
 * @createTime 2023年06月01日 19:15:00
 */
public class OpenCVImageSimilarity {
    public static void main(String[] args) {
        // 加载OpenCV库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // 读取两张图像。准备比对的图片
        Mat image1 = Imgcodecs.imread("C:\\Users\\Pictures\\0009.jpg");
        Mat image2 = Imgcodecs.imread("C:\\Users\\Pictures\\0011.jpg");


        // 将图片处理成一样大
        Imgproc.resize(image1, image1, image2.size());
        Imgproc.resize(image2, image2, image1.size());

        // 计算均方差(MSE)
        double mse = calculateMSE(image1, image2);
        System.out.println("均方差(MSE): " + mse);

        // 计算结构相似性指数(SSIM)
        double ssim = calculateSSIM(image1, image2);
        System.out.println("结构相似性指数(SSIM): " + ssim);

        // 计算峰值信噪比(PSNR)
        double psnr = calculatePSNR(image1, image2);
        System.out.println("峰值信噪比(PSNR): " + psnr);

        // 计算直方图
        final double similarity = calculateHistogram(image1, image2);
        System.out.println("图片相似度(直方图): " + similarity);

        // 计算归一化交叉相关(NCC)
//        double ncc = calculateNCC(image1, image2);
//        System.out.println("归一化交叉相关(NCC): " + ncc);
    }

    // 计算均方差(MSE)
    private static double calculateHistogram(Mat image1, Mat image2) {
        // 计算直方图
        Mat hist1 = calculateHistogram(image1);
        Mat hist2 = calculateHistogram(image2);

        // 计算相似度
        final double similarity = Imgproc.compareHist(hist1, hist2, Imgproc.CV_COMP_CORREL);
        return similarity;
    }


    // 计算均方差(MSE)
    private static double calculateMSE(Mat image1, Mat image2) {
        Mat diff = new Mat();
        Core.absdiff(image1, image2, diff);
        Mat squaredDiff = new Mat();
        Core.multiply(diff, diff, squaredDiff);
        Scalar mseScalar = Core.mean(squaredDiff);
        return mseScalar.val[0];
    }

    // 计算结构相似性指数(SSIM)
    private static double calculateSSIM(Mat image1, Mat image2) {
        Mat image1Gray = new Mat();
        Mat image2Gray = new Mat();
        Imgproc.cvtColor(image1, image1Gray, Imgproc.COLOR_BGR2GRAY);
        Imgproc.cvtColor(image2, image2Gray, Imgproc.COLOR_BGR2GRAY);
        MatOfFloat ssimMat = new MatOfFloat();
        Imgproc.matchTemplate(image1Gray, image2Gray, ssimMat, Imgproc.CV_COMP_CORREL);
        Scalar ssimScalar = Core.mean(ssimMat);
        return ssimScalar.val[0];
    }

    // 计算峰值信噪比(PSNR)
    private static double calculatePSNR(Mat image1, Mat image2) {
        Mat diff = new Mat();
        Core.absdiff(image1, image2, diff);
        Mat squaredDiff = new Mat();
        Core.multiply(diff, diff, squaredDiff);
        Scalar mseScalar = Core.mean(squaredDiff);
        double mse = mseScalar.val[0];
        double psnr = 10.0 * Math.log10(255.0 * 255.0 / mse);
        return psnr;
    }

    // 计算归一化交叉相关(NCC)
//    private static double calculateNCC(Mat image1, Mat image2) {
//        Mat image1Gray = new Mat();
//        Mat image2Gray = new Mat();
//        Imgproc.cvtColor(image1, image1Gray, Imgproc.COLOR_BGR2GRAY);
//        Imgproc.cvtColor(image2, image2Gray, Imgproc.COLOR_BGR2GRAY);
//        MatOfInt histSize = new MatOfInt(256);
//        MatOfFloat ranges = new MatOfFloat(0, 256);
//        Mat hist1 = new Mat();
//        Mat hist2 = new Mat();
//
//        Core.normalize(hist1, hist1, 0, 1, Core.NORM_MINMAX);
//        Core.normalize(hist2, hist2, 0, 1, Core.NORM_MINMAX);
//        double ncc = Core.compareHist(hist1, hist2, Imgproc.CV_COMP_CORREL);
//        return ncc;
//    }

    private static Mat calculateHistogram(Mat image) {
        Mat hist = new Mat();

        // 设置直方图参数
        MatOfInt histSize = new MatOfInt(256);
        MatOfFloat ranges = new MatOfFloat(0, 256);
        MatOfInt channels = new MatOfInt(0);
        List<Mat> images = new ArrayList<>();
        images.add(image);

        // 计算直方图
        Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);

        return hist;
    }
}

3.会遇到一个问题

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java455 in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java455 in java.library.path: [C:\Program Files\Java\jdk-14.0.2\bin, C:\Windows\Sun\Java\bin, C:\Windows\system32, C:\Windows, C:\Windows\system32, C:\Windows, C:\Windows\System32\Wbem, C:\Windows\System32\WindowsPowerShell\v1.0\, C:\Windows\System32\OpenSSH\, D:\angus\soft\Xshell 7\, D:\angus\soft\Xftp 7\, C:\Program Files\Git\cmd, C:\Program Files\Java\jdk-14.0.2\bin, C:\Users\angus\AppData\Local\Microsoft\WindowsApps, ., D:\angus\soft\Microsoft VS Code\bin, .]
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2680)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:807)
	at java.base/java.lang.System.loadLibrary(System.java:1907)
	at com.angus.easyes.temp.OpenCVImageSimilarity.main(OpenCVImageSimilarity.java:17)

4.解决方法

Exception in thread “main“ java.lang.UnsatisfiedLinkError: no opencv_java455 in java.library.path:_水的精神的博客-CSDN博客

5.运行效果

opencv图像对比,计算机视觉,开发经验,opencv,计算机视觉,人工智能

6.相似性效果对比

https://blog.csdn.net/star1210644725/article/details/131005052?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131005052%22%2C%22source%22%3A%22star1210644725%22%7Dhttps://blog.csdn.net/star1210644725/article/details/131005052?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131005052%22%2C%22source%22%3A%22star1210644725%22%7D文章来源地址https://www.toymoban.com/news/detail-571834.html

到了这里,关于使用openCV比对任意两张图片的相似度(亲测较准确)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3 OpenCV两张图片实现稀疏点云的生成

    前文: 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵+RANSAC原理与实践 1.1 由F到E E = K T ∗ F ∗ K E = K^T * F * K E = K T ∗ F ∗ K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 相机内参获得的方式是一个较为复杂的方式,需要使用棋盘进行定位获得

    2024年02月07日
    浏览(36)
  • OpenCV完美实现两张图片的全景拼接(详细教程)

    目录 1,主要步骤 1.1  导入需要的包和模块,并读取两张待拼接的图片,这里我们假设它们为 left.jpg 和 right.jpg。 1.2  创建SIFT检测器 1.3 创建一个基于 FLANN 的匹配器 1.4  筛选过程删除掉一些不合适的匹配点,只保留最好的匹配点 1.5透视变换 1.6  消除重叠的效果,对两张

    2024年02月06日
    浏览(42)
  • OpenCV书签 #余弦相似度的原理与相似图片/相似文件搜索实验

    余弦相似度(Cosine Similarity) ,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度仅仅与向量的指向方向相关,与向量的长度无关,它将向量根据坐标值绘制到向量空间中,如最常见的二维空间。因此,万物皆向量,我们可以使用余弦相

    2024年01月24日
    浏览(50)
  • OpenCV 人脸识别、图片相似度检测

    识别出人脸后会得到两个人脸的 Rect 数组,然后比较这两个 Rect 数组的相似度即可! 实现步骤 ==== 工程目录准备 新建 Android Studio 项目  OpenCVCheck 导入 OpenCVLibrary320 在 module 下的 build.gradle 中引入 OpenCVLibrary 的编译: compile project(‘:openCVLibrary320’) 检测任意两张图片的相似度的

    2024年04月16日
    浏览(31)
  • python opencv比较图片相似度

    目录 一:均值哈希算法 二:三直方图算法 三:单通道直方图 一:均值哈希算法 均值哈希算法是一种快速比较图像相似度的方法。它首先将图像转化为灰度图像,然后计算图像的均值,接着将每个像素的

    2024年02月22日
    浏览(37)
  • 使用ffmpeg拼接两张图片

      最近在工作中遇到了一个需求,就是需要将两张图片拼接在一起,作为一个封面图。如果只是临时拼接一张,我们可以只用photoshop之类的图片编辑工具,将两张图片拼接在一起。而我们的需要是需要实现自动化,由于之前使用过ffmpeg做过图片的操作,于是搜索了下,ffm

    2024年02月02日
    浏览(31)
  • python之对比两张图像的相似度

    本着结合实际工作,实际落地并已应用的态度去码文。 需求:在某个手机端项目中,有多个页面图片,但每个图片都做了相应的修改,由于这种图片非常多,高达上万张,每周有新的内容出现且需要回归。 在某些特定的节点,不允许相邻两张出现一模一样的图片,如果人去

    2024年02月07日
    浏览(29)
  • OpenCV书签 #结构相似性SSIM算法的原理与图片相似性实验

    结构相似性(Structural Similarity,简称SSIM算法) ,主要用于检测两张相同尺寸的图像的相似度、或者检测图像的失真程度,是一种衡量两幅图像相似度的指标。 给定两个图像 x 和 y,两张图像的结构相似性可按照以下方式求出: 结构相似性的范围为 -1 到 1。当两张图像一模一

    2024年01月24日
    浏览(42)
  • python 身份证读取 照片并通过摄像头实时 比对相似度 人证比对软件 源码

    最近朋友需要一个人证比对软件需要实现以下功能: 通过摄像头实时采集人脸图像 通过身份证读卡器采集身份证信息 和 身份证照片 使用实时人脸照片 和 身份证照片做相似度比对 比对后返回相似度,或者返回同一人,非同一人 实时采集照片 和 身份证信息照片存档,方便

    2024年02月11日
    浏览(72)
  • OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

    图片特征向量是一种用于描述图片内容的数学表示,它可以反映图片的颜色、纹理、形状等信息。图片特征向量可以用于做很多事情,比如图片检索、分类、识别等。 本文将介绍图片特征向量的提取以及相似度的计算,并使用C#来实现它们。 文章开始前,我们先来简单了解一

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包