精华内容
下载资源
问答
  • opencv图像相似度对比

    2015-06-17 09:33:12
    opencv的关于两幅图像相似度对比的程序,具有很大的参考意义
  • 该压缩包包含编译方式,示例代码,只需拍两张图片即可比较,比较打印输出值小于10,即为相似图片。使用改代码的用户linux系统必须先安装opencv环境.
  • opencv 检索图片包含关系 图片相似度对比 http://blog.csdn.net/CSND_Ayo/article/details/53198760
  • 利用OpenCv提供的函数接口实现了两个图像的相似度的计算
  • android 使用opencv4 图片相似度对比

    千次阅读 2019-09-27 16:39:44
    最近项目中需要做到图片相似度对比,搜了半天,网上有很多直接方法,但是感觉没那么靠谱,都是有弊端,eg:https://blog.csdn.net/hnulwt/article/details/43668161 ... 上面的方法都很有价值。 ...

           最近项目中需要做到图片相似度对比,搜了半天,网上有很多直接方法,但是感觉没那么靠谱,都是有弊端,eg:https://blog.csdn.net/hnulwt/article/details/43668161

    https://blog.csdn.net/u010652002/article/details/72722198

    上面的方法都很有价值。

    觉的最靠谱的方法有两种:

           一种是使用tess-two,训练自己的图片,然后做识别,但是中间遇到了写问题就没有用。

           有想试试的可以访问https://blog.csdn.net/u013087553/article/details/94445109

           另一种是使用openCV,里面有Imgproc.compareHist这个方法可以比较图片相似度,倒是很方便。

           下面我就讲讲关于使用openCV的坑(找了半天文章,各种问题出现):

            一、集成OpenCV

            1.到openCV官网下载android版,我下的是最新的4.1.1。

            下载完后有四个文件:

            

               2.

    导入java文件;进入file-new-import module,source directory中填入之前介绍的sdk包中的java文件,如下图所示,填好之后,会自动填入java(可以自己改名字),(如下图所示)然后点击next。

    然后出现下图,直接点击finish:

    然后opencv就被导入项目了,样子如下图。

    然后咱们引用一下File --- Project Structure ---- app ----Dependencies,点击“+”号,选择第三个module dependcy,把java引入:

    但是会报错,别着急,一项一项解决:

    1.将java的build.gradle打开,修改compileSdkVersion和buildToolsVersion改成跟app里面的一致。

    2.将apply plugin: 'com.android.application' 改为apply plugin: 'com.android.library'。

    3.将defaultConfig删除。

    4.将app的build.gradle中applicationId这句话也删掉。

    现在就不会报错了。

    3.在app/src/main目录下新建个jinLibs的文件夹,将sdk下native下的libs复制进来:

    到这我以为可以使用了,在mainActivity初始化一下:

     @Override
        protected void onResume() {
            super.onResume();
            if(!OpenCVLoader.initDebug()){
                Log.d(getClass().getName(),"Internal OpenCV library not found. Using OpenCV manger for initialization");
                OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
            }else{
                Log.d(getClass().getName(),"OpenCV library found inside package. Using it!");
                mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
            }
        }
    
        private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                switch (status) {
                    case LoaderCallbackInterface.SUCCESS: {
                        Log.i("rr", "OpenCV loaded successfully");
                    }
                    break;
                    default: {
                        super.onManagerConnected(status);
                    }
                    break;
                }
            }
        };

    然后运行一下,网上都是说这样就不需要安装manager,但是我运行以后还是让安装:

    我看了一下日志,如下:

    上面显示"info"和"libc++"没有找到,点进去我看了一下,"info"不需要管,它里面try,catch了。我们需要解决一下"lib++"这个问题,我试了半天都没用,在defaultConfig添加了   ndk {//设置支持的SO库架构abiFilters 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'}这句话也没用,我就去掉了,但是从别人的项目拷了so文件就好了,如果你也不行到时候从我项目拷so文件就行。

    因为我要做的是图片相似度对比,接下来的就是图片相似度对比的代码:

    主要代码:

     @Override
        public void onClick(View v) {
            Mat mat1 = new Mat();
            Mat mat2 = new Mat();
            Mat mat11 = new Mat();
            Mat mat22 = new Mat();
            Utils.bitmapToMat(mBitmap1, mat1);
            Utils.bitmapToMat(mBitmap2, mat2);
            Imgproc.cvtColor(mat1, mat11, Imgproc.COLOR_BGR2GRAY);
            Imgproc.cvtColor(mat2, mat22, Imgproc.COLOR_BGR2GRAY);
            comPareHist(mat11, mat22);
        }
    
        /**
         * 比较来个矩阵的相似度
         * @param srcMat
         * @param desMat
         */
        public void comPareHist(Mat srcMat,Mat desMat){
    
            srcMat.convertTo(srcMat, CvType.CV_32F);
            desMat.convertTo(desMat, CvType.CV_32F);
            double target = Imgproc.compareHist(srcMat, desMat, Imgproc.CV_COMP_CORREL);
            Log.e(TAG, "相似度 :   ==" + target);
            Toast.makeText(this, "相似度 :   ==" + target, Toast.LENGTH_SHORT).show();
        }

    这里需要注意的一点,两张图片的尺寸一定要一样,不然会报:Error: Assertion failed (A.size == arrays[i0]->size) in init, file /build/master_pack-android/opencv/modules/core/src/matrix_iterator.cpp, line 72这个错。

    项目地址:

    链接:https://pan.baidu.com/s/1R1bJdPmqJkPue5pgryGAEw
    提取码:us1f

    展开全文
  • c# OpenCvSharp 图片相似度比较,四种方法对比,SSIM,PSNR,灰度直方图比较,RGB三通道全彩直方图比较,亲测,效果不错。
  • 利用OpenCvSharp实现感知哈希算法进行图片相似度对比及Stitcher类图像拼接生成全景图像 vs2015环境
  • python OpenCV 图片相似度 5种算法

    万次阅读 多人点赞 2019-05-17 15:28:34
    原始两张图片: 代码运行结果如下。 5种算法 值哈希算法、差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同。 三直方图和单通道直方图的值为0-1,值越...

    原始两张图片:

     

    代码运行结果如下。

    5种算法

    值哈希算法差值哈希算法感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同。 三直方图单通道直方图的值为0-1,值越大,相似度越高。

    源代码如下:

    import cv2
    import numpy as np
    from PIL import Image
    import requests
    from io import BytesIO
    import matplotlib
    matplotlib.use('TkAgg')
    import matplotlib.pyplot as plt
    
    
    def aHash(img):
        # 均值哈希算法
        # 缩放为8*8
        img = cv2.resize(img, (8, 8))
        # 转换为灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # s为像素和初值为0,hash_str为hash值初值为''
        s = 0
        hash_str = ''
        # 遍历累加求像素和
        for i in range(8):
            for j in range(8):
                s = s+gray[i, j]
        # 求平均灰度
        avg = s/64
        # 灰度大于平均值为1相反为0生成图片的hash值
        for i in range(8):
            for j in range(8):
                if gray[i, j] > avg:
                    hash_str = hash_str+'1'
                else:
                    hash_str = hash_str+'0'
        return hash_str
    
    
    def dHash(img):
        # 差值哈希算法
        # 缩放8*8
        img = cv2.resize(img, (9, 8))
        # 转换灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        hash_str = ''
        # 每行前一个像素大于后一个像素为1,相反为0,生成哈希
        for i in range(8):
            for j in range(8):
                if gray[i, j] > gray[i, j+1]:
                    hash_str = hash_str+'1'
                else:
                    hash_str = hash_str+'0'
        return hash_str
    
    
    def pHash(img):
        # 感知哈希算法
        # 缩放32*32
        img = cv2.resize(img, (32, 32))   # , interpolation=cv2.INTER_CUBIC
    
        # 转换为灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 将灰度图转为浮点型,再进行dct变换
        dct = cv2.dct(np.float32(gray))
        # opencv实现的掩码操作
        dct_roi = dct[0:8, 0:8]
    
        hash = []
        avreage = np.mean(dct_roi)
        for i in range(dct_roi.shape[0]):
            for j in range(dct_roi.shape[1]):
                if dct_roi[i, j] > avreage:
                    hash.append(1)
                else:
                    hash.append(0)
        return hash
    
    
    def calculate(image1, image2):
        # 灰度直方图算法
        # 计算单通道的直方图的相似值
        hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
        hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
        # 计算直方图的重合度
        degree = 0
        for i in range(len(hist1)):
            if hist1[i] != hist2[i]:
                degree = degree + \
                    (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
            else:
                degree = degree + 1
        degree = degree / len(hist1)
        return degree
    
    
    def classify_hist_with_split(image1, image2, size=(256, 256)):
        # RGB每个通道的直方图相似度
        # 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值
        image1 = cv2.resize(image1, size)
        image2 = cv2.resize(image2, size)
        sub_image1 = cv2.split(image1)
        sub_image2 = cv2.split(image2)
        sub_data = 0
        for im1, im2 in zip(sub_image1, sub_image2):
            sub_data += calculate(im1, im2)
        sub_data = sub_data / 3
        return sub_data
    
    
    def cmpHash(hash1, hash2):
        # Hash值对比
        # 算法中1和0顺序组合起来的即是图片的指纹hash。顺序不固定,但是比较的时候必须是相同的顺序。
        # 对比两幅图的指纹,计算汉明距离,即两个64位的hash值有多少是不一样的,不同的位数越小,图片越相似
        # 汉明距离:一组二进制数据变成另一组数据所需要的步骤,可以衡量两图的差异,汉明距离越小,则相似度越高。汉明距离为0,即两张图片完全一样
        n = 0
        # hash长度不同则返回-1代表传参出错
        if len(hash1) != len(hash2):
            return -1
        # 遍历判断
        for i in range(len(hash1)):
            # 不相等则n计数+1,n最终为相似度
            if hash1[i] != hash2[i]:
                n = n + 1
        return n
    
    
    def getImageByUrl(url):
        # 根据图片url 获取图片对象
        html = requests.get(url, verify=False)
        image = Image.open(BytesIO(html.content))
        return image
    
    
    def PILImageToCV():
        # PIL Image转换成OpenCV格式
        path = "/Users/waldenz/Documents/Work/doc/TestImages/t3.png"
        img = Image.open(path)
        plt.subplot(121)
        plt.imshow(img)
        print(isinstance(img, np.ndarray))
        img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
        print(isinstance(img, np.ndarray))
        plt.subplot(122)
        plt.imshow(img)
        plt.show()
    
    
    def CVImageToPIL():
        # OpenCV图片转换为PIL image
        path = "/Users/waldenz/Documents/Work/doc/TestImages/t3.png"
        img = cv2.imread(path)
        # cv2.imshow("OpenCV",img)
        plt.subplot(121)
        plt.imshow(img)
    
        img2 = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        plt.subplot(122)
        plt.imshow(img2)
        plt.show()
    
    def bytes_to_cvimage(filebytes):
        # 图片字节流转换为cv image
        image = Image.open(filebytes)
        img = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
        return img
    
    def runAllImageSimilaryFun(para1, para2):
        # 均值、差值、感知哈希算法三种算法值越小,则越相似,相同图片值为0
        # 三直方图算法和单通道的直方图 0-1之间,值越大,越相似。 相同图片为1
    
        # t1,t2   14;19;10;  0.70;0.75
        # t1,t3   39 33 18   0.58 0.49
        # s1,s2  7 23 11     0.83 0.86  挺相似的图片
        # c1,c2  11 29 17    0.30 0.31
    
        if para1.startswith("http"):
             # 根据链接下载图片,并转换为opencv格式
            img1 = getImageByUrl(para1)
            img1 = cv2.cvtColor(np.asarray(img1), cv2.COLOR_RGB2BGR)
    
            img2 = getImageByUrl(para2)
            img2 = cv2.cvtColor(np.asarray(img2), cv2.COLOR_RGB2BGR)
        else:
            # 通过imread方法直接读取物理路径
            img1 = cv2.imread(para1)
            img2 = cv2.imread(para2)
    
        hash1 = aHash(img1)
        hash2 = aHash(img2)
        n1 = cmpHash(hash1, hash2)
        print('均值哈希算法相似度aHash:', n1)
    
        hash1 = dHash(img1)
        hash2 = dHash(img2)
        n2 = cmpHash(hash1, hash2)
        print('差值哈希算法相似度dHash:', n2)
    
        hash1 = pHash(img1)
        hash2 = pHash(img2)
        n3 = cmpHash(hash1, hash2)
        print('感知哈希算法相似度pHash:', n3)
    
        n4 = classify_hist_with_split(img1, img2)
        print('三直方图算法相似度:', n4)
    
        n5 = calculate(img1, img2)
        print("单通道的直方图", n5)
        print("%d %d %d %.2f %.2f " % (n1, n2, n3, round(n4[0], 2), n5[0]))
        print("%.2f %.2f %.2f %.2f %.2f " % (1-float(n1/64), 1 -
                                             float(n2/64), 1-float(n3/64), round(n4[0], 2), n5[0]))
    
        plt.subplot(121)
        plt.imshow(Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)))
        plt.subplot(122)
        plt.imshow(Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)))
        plt.show()
    
    if __name__ == "__main__":
        p1="https://ww3.sinaimg.cn/bmiddle/007INInDly1g336j2zziwj30su0g848w.jpg"
        p2="https://ww2.sinaimg.cn/bmiddle/007INInDly1g336j10d32j30vd0hnam6.jpg"
        runAllImageSimilaryFun(p1,p2)
    

    以下为测试了一些图片的相似度值。

    五个值分别代表 均值哈希算法相似度、差值哈希算法相似度、感知哈希算法相似度、三直方算法相似度、单通道直方图相似度 

     

    参考文章:

    https://www.cnblogs.com/dcb3688/p/4610660.html
    https://blog.csdn.net/haofan_/article/details/77097473?locationNum=7&fps=1
    https://blog.csdn.net/feimengjuan/article/details/51279629

     

    展开全文
  • OpenCV进行图像相似度对比的几种办法
    展开全文
  • Python3通过OpenCV对比图片相似度

    万次阅读 多人点赞 2018-09-28 20:43:36
    一、环境配置 ... 环境:Python3.7 运行命令: ...brew install opencv3 --with-python3 --c++11 --with-contrib 接着运行: brew link --force opencv3 现在测试下,结果如下: $ python3...

    一、环境配置

    参考:https://blog.csdn.net/willduan1/article/details/53898440
    环境:Python3.7
    运行命令:

    brew install opencv3 --with-python3 --c++11 --with-contrib
    

    接着运行:

    brew link --force opencv3
    

    现在测试下,结果如下:

    $ python3
    Python 3.7.0 (default, Jul 23 2018, 20:22:55) 
    [Clang 9.1.0 (clang-902.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import cv2
    >>> 
    

    二、图片对比

    代码如下:

    from skimage.measure import compare_ssim
    import cv2
    
    class CompareImage():
    
        def compare_image(self, path_image1, path_image2):
    
            imageA = cv2.imread(path_image1)
            imageB = cv2.imread(path_image2)
    
            grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
            grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
    
            (score, diff) = compare_ssim(grayA, grayB, full=True)
            print("SSIM: {}".format(score))
            return score
    
    
    compare_image = CompareImage()
    compare_image.compare_image("1.jpg", "2.jpg")
    

    图片资源:在这里插入图片描述
    在这里插入图片描述
    测试结果:

    SSIM: 0.36454305667390974
    
    展开全文
  • opencv 图片对比相似度

    万次阅读 2017-10-23 17:07:08
    判断标准:特征值相似度小于一个给定值的特征值个数2、直方图对比Android代码(http://blog.acronym.co.kr/580 ) List<Mat> listImage1 = new ArrayList(); List<Mat> listImage2 = new ArrayList(); Mat hsv_
  • 这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、相关概念 一般我们人区分谁是谁,给物品分类,都...
  • import cv2 from math import * def rota(img, degree): height, width = img.shape[:2] # 旋转后的尺寸 heightNew = int(width * fabs(sin(radians(degree))) + height * fabs(cos(radians(degree)))) ...
  • import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import java.util.Arrays; pub...
  • 图片相似度对比 package com.test; import java.util.ArrayList; import java.util.List; import org.opencv.core.Core;  import org.opencv.core.Mat;  import org.opencv.core.MatOfFloat; import org....
  • OpenCV图像相似度检测,Python实现

    千次阅读 2020-05-20 08:20:35
    OpenCV图像相似度检测,简单的说是大图中找小图。 假设把大图 中的一部分图Android小机器人检测出来 并用红色的线框出来。 # OpenCV图像相似度检测matchTemplate,Python实现 import cv2 as cv if __...
  • 首先采用了主流框架OpenCV,该框架同时提供了以下几种对比图片方法。 1、PSNR峰值信噪比 PSNR是最普遍和使用最为广泛的一种图像客观评价指标,然而它是基于对应像素点间的误差,即基于误差敏感的图像质量评价...
  • opencv 简单的图片相似度匹配

    千次阅读 2020-08-06 19:26:51
    一、基本知识 1、各种图片读取的函数读取到的数据格式是 RGB 还是 BGR? 使用 scipy.misc.imread 读取的图片数据是 RGB 格式; 使用 cv2.imread 读取...二、常见的图片相似度去重的方法 1、opencv各个相似度...
  • 想做一个图片相似度比较的程序,网上也找了好多资料,基本都是哈希算法,或者就是opencv直方图比较(灰度图),准确度不高,在opencv官网有看到一个直方图比较图片相似度的,但是是C++写的,本来想用java直接模仿它...
  • 这里需要使用SSIM (Structual Similarity, 结构相似性) 用来判断图片相似度 一、SSIM 结构相似性指数(Structural Similarity Index,SSIM index)是一种用以衡量两张数位影像相似程度的指标。当两张影像其中一张为无...
  • java实现OpenCV 4.1.0人脸相似度对比

    千次阅读 2019-12-10 14:55:04
    需要opencv的jar,从opencv的安装路径中可以获取。 package com.ahies.dit.management.util; import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import ...
  • 计算图片相似度的应用很广泛,如google、baidu、360等搜索引擎以图搜图的功能就是其典型应用 相似图像去重一般分为如下两个步骤 1、图像特征表达的提取 2、图像之间相似度计算两个主要步骤。 对于图像特征表达的...
  • 方法描述:有两幅图像patch(当然也可是整幅图像),分别计算两幅图像的直方图,并将直方图进行归一化,然后按照某种距离度量的标准进行相似度的测量。 方法的思想:基于简单的向量相似度来对图像相似度进行度量。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,533
精华内容 613
关键字:

opencv图片相似度对比