精华内容
下载资源
问答
  • 2021-05-27 15:19:39

    在本文中,我们将介绍如何使用图像相似性量度库来比较图像。根据库的文档,我们可以使用八种不同的评估指标来计算图像之间的相似度。

    幸运的是,所有可怕的数学运算已为我们实现,我们可以立即开始测量图像相似度。我们只需要调用所选评估指标的名称并传递两个图像作为参数即可。例如:

    请注意,默认指标是psnr。

    有两种使用此软件包的方法:您可以在终端中执行命令或编写单独的Python脚本。

    如果要在两个图像之间进行快速评估,请在终端中运行以下命令:

    (可选)添加— metric标志以指示要使用的评估指标。

    在本文中,我选择了三个评估指标:rmse,psnr和ssim。

    首先,让我们了解我们将要构建的程序:

    我们会将原始图片作为参数传递给我们的程序。

    该代码将遍历数据集文件夹中的所有图像,并计算每个图像与原始图像之间的相似度值。

    最后,我们将打印每个评估指标的各个结果。

    编程
    让我们使用pip或pip3安装库:

    接下来,创建一个新的Python脚本文件并粘贴以下代码:

    上述代码分析:

    导入必要的库文件

    无需每次运行脚本都对图像进行硬编码,而是使用argv [1]函数提供图像名称作为命令行参数。

    我们使用OpenCV Python包读取图像。我的将在一个单独的文件夹中,称为test。如果需要,请调整代码。

    为了比较不同指标的结果,我们将创建字典,其中的键是数据集图像的名称,而值是相似度值。

    图像相似性度量程序包要求图像具有相同的形状。 由于我们正在比较形状稍有不同的图像,因此我们需要提供相同的形状。 为此,我们将使用cv2.resize(data_img,dim,interpolation = cv2.INTER_AREA)函数,在该函数中,将根据原始图像的尺寸调整数据集图像的大小。

    我们将遍历数据集目录,调整每个图像的大小,然后填充每个字典。请注意,由于尺寸调整,图像可能会变形。

    calc_closest_val(dict,checkMax)函数返回最相似的图像。 它还打印出每个图像的相似度值。 请注意,根据某些评估指标(如RMSE),值0表示该数据非常合适。 对于其他指标,反之亦然-值越高,匹配越好。 这就是为什么我们要使用bool参数checkMax。 它根据字典中的最小值或最大值选择最接近的图像。

    最后,为方便起见,我们将根据每个评估指标显示最相似的图像。

    演示
    首先,我将为原始图像创建一个文件夹。然后,我将比较图像放置在数据集文件夹中。

    这个红苹果将是我们原始的查询图像:

    我们将其与其他水果进行比较:

    现在,让我们运行Python程序,找出最匹配的一个:

    输出:

    如您所见,青苹果是赢家。如果查看每个结果,就会发现第二个最相似的图像是红梨。

    现在,让我们来看看当很难预测结果时会发生什么。让我们将红色番茄的照片放在数据集文件夹中:

    我要说的是,青苹果和番茄看起来都像红苹果。让我们根据数学来检查结果:

    为了使它更加令人兴奋,让我们尝试比较更多不同的图像。自从我喜欢绘画以来,我为此实验拍摄了自己的绘画照片。

    本文完整代码

    详情参阅 - 亚图跨际

    更多相关内容
  • 本文于infoq,介绍了传统的hash算法,卷积神经网络计算图片相似度,...本文通过设计实验,对比三类图像相似度计算方法:感知哈希算法、基于局部不变性的图像相似度匹配算法以及基于卷积神经网络的图像相似度算法,权衡其
  • 模拟SAR图像与真实SAR图像相似度评估方法
  • 这是基于The Unreasonable Effectiveness of Deep Features as a Perceptual Metric 中所提到的感知相似度计算网络代码,里面有链接可供下载作者训练好的权重。供大家参考
  • 这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、相关概念 一般我们人区分谁是谁,给物品分类,都...
  • 图像相似度 使用几种技术的Python图像相似度比较 要求: sudo apt-get install -y python-pip sudo pip install PIL numpy 用法 将脚本保存到与主脚本相同的文件夹中 从脚本导入功能 from image_similarity import...
  • 这个文件中包含了三种图像相似度的计算方法,分别是灰度分布计算方法、颜色分布直方图计算方法、还有结构相似度SSIM计算方法。
  • 随着信息社会的发展,图像作为信息呈现的主要形式,在各个领域都有显著的影响。在图像编辑和处理软件的快速发展的背景下,图像...本代码通过提取图像的颜色矩,利用欧式距离以及余弦夹角的方法,求解图像间的相似度
  • 使用深度学习进行图像相似度搜索 该项目演示了如何利用深度学习进行最先进的图像相似性搜索。 我使用了tensorflow和一些公开可用的数据集。 结果 怎么跑 下载文件夹,extraxt并将其保存在服务器目录中 下载数据集,...
  • 图像相似度比较

    2021-02-05 13:00:18
    在vc中用c++实现图片相似度比较_方法及源码
  • 1.8编程基础之多维数组01矩阵交换行-06.图像相似度(D)
  • Python图像相似度

    2014-03-04 21:59:30
    Python语言利用图像处理库PIL计算图像相似度
  • 计算两幅图像相似度百分比的不同程序 hashes.py - 基于 phash 计算图像相似度 drawMatches.py - 2 个图像的相似点的映射 knn.py - 遍历给定文件夹中的所有图像以查找相似图像(sim % > 80)并删除它们 knnsingle.py ...
  • SonTHT 和 Haonguyen 这是我们论文的图像比较演示。 许可证:GPL v2.0
  • c#图像相似度比较demo

    热门讨论 2018-03-02 16:39:15
    在网上找的用灰度直方图方法计算相似度的算法写的小例子,经测试效果还可以
  • opencv图像相似度对比

    2015-06-17 09:33:12
    opencv的关于两幅图像相似度对比的程序,具有很大的参考意义
  • 图像相似度计算MATLAB代码机器学习 我的机器学习代码是用Python编写的。 1.环境设置 (1)在Windows10上安装Python 3.5。 (2)安装IPython 4.0.3。 (3)安装机器学习软件包安装程序。 (4)运行IPython并在浏览器...
  • rgb图像相似度 get rgb hist
  • 图像相似度计算方法--直方图比较,工程基于vs2005+opencv210实现。下载资源后,如果与自己使用的opencv版本不一致,则需要对工程进行简单配置才能正确运行。
  • 图像相似度

    千次阅读 2018-08-29 14:11:56
    近来(2015-2017年),利用深度学习计算图像相似度(也可理解为图像匹配)的思想非常相似,皆源于Siamese Networks(经典老文献《Signature Verification Using a Siamese Time Delay Neural Network》)。...

    近来(2015-2017年),利用深度学习计算图像相似度(也可理解为图像匹配)的思想非常相似,皆源于Siamese Networks(经典老文献《Signature Verification Using a Siamese Time Delay Neural Network》)。目的就是比较两幅图片是否相似,或者说相似度是多少,因此构建的卷积神经网络模型的输入就是:两幅图片,然后网络的输出是一个相似度数值(0-1范围内)

    以下三篇论文是近一周读的,且均跑了源码,特此记录下:

    注意:以下三篇论文均用到libertyyosemite notredame数据集,下载网址http://matthewalunbrown.com/patchdata/patchdata.html 

    关于数据集的描述可参考另一篇笔记(Liberty_NotreDame_Yosemite数据集)。

     

    一、《Learning to Compare Image Patches via Convolutional Neural Networks cvpr2015

    源码在:https://github.com/szagoruyko/cvpr15deepcompare,需要依赖torch 

        实验记录:作者说提供了训练好的网络资源,且提供了Torch, MATLAB and with OpenCVdemo

        目前仅在Linux下跑了opencvdemo,但根据查看opencvdemo源码(opencv/example.cpp),貌似仅仅利用opencv计算了特征点和欧氏距离进行匹配,源码主要依赖extractPatchesextractDescriptors这两个函数

        遗留问题:c++ apiMATLABdemo具体如何,以及opencvdemo源码未理解和解读。

        

        paper主要创新点:

        1patch1patch2合在一起,把这两张图片,看成是一张双通道的图像。也就是把两个(16464)单通道的数据,放在一起,成为了(26464)的双通道矩阵,然后把这个矩阵数据作为网络的输入;

        2结合Central-surround two-stream network,将一张图片处理成两张图片,详细操作可查看原文或者http://blog.csdn.net/hjimce/article/details/50098483;如下图所示

     

        3paper采用了如下损失函数进行训练:

        公式第一部分就是正则项,采用L2正则项。第二部分误差损失部分

    是网络第i对训练图片的输出神经元,yi的取值是-11,当输入图片是matching的时候,为1,当non-matching的时候是-1。参数训练更新方法采用ASGD,其学习率恒为1.0,动量参数选择0.9,训练的min-batch大小选择128。权重采用随机初始化方法。然后权重衰减大小选择

    二、《MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching CVPR2015

    源码在:https://github.com/hanxf/matchnet 需要依赖caffe

        实验记录:首先该源码基于caffepycaffe已经完全配置好,需要注意的一点是最好在caffe-master的文件下clone该源码且运行,否则会报错(该错误是网上一位小伙伴的记录,具体是否真实不详,但是按照这样做的确没有问题)。源码分为两大块:run_gen_data.sh  run_eval.shrun_gen_data.sh是调用generate_patch_db.py来生成patchdb文件(该文件时caffe特定的图像文件格式);run_eval.sh是调用evaluate_matchnet.py计算结果的。eval_metrics.py 用来计算两个patch的相似度值(输出0-1范围内值)。

        遗留问题:如何将自己的图片转为db文件,并计算相似度值。

        /*修改于2018.01.18

        针对遗留问题,做出回答:

        1)利用caffe的数据datanum来存储图像数据,将图像转为db文件,generate_patch_db.py源码中图像为1024*1024bmp灰度图像,由16*16patch64*64)组成,数据以patch为单位顺序存储,因此若想自己输入一对图想计算相似度,可以自己制作info.txt等输入进行计算,需要注意的依照源码制作m50_n1_n2_0.txt

        */

        paper知识点A. Feature Network:主要用于提取输入patch的特征,主要根据AlexNet改变而来,有些许变化。主要的卷积和pool层的两段分别有 preprocess layer  bottlebeck layer,各自起到归一化数据和降维,防止过拟合的作用;

          B: Metric Network:主要用于feature Comparison3fc 加上 softmax

          C: 在训练阶段,特征网络用作双塔,共享参数。双塔的输出串联在一起作为度量网络的输入。Feature 和 metric networks两个网络一起训练,其cross-entropy error为

        其中npatch pairs的数量。

        yi为输入pairs xi的标签(0/1),1代表匹配。 

        v0(xi)v1(xi)FC3输出的两个值。 

        yi^1−yi^FC3输出的两个值经过Softmax计算后的结果,公式如下: 

        目的是minimize上式,训练方法是batch size32SGD 在预测的时候,这两个子网络 B 方便的用在 two-stage pipeline. 如下图所示:

    三、《PN-Net: Conjoined Triple Deep Network for Learning Local Image Descriptors CVPR2016  与前两篇论文进行了对比

    源码在https://github.com/vbalnt/pnnet  

    目前还未实验

    展开全文
  • 可根据直方图计算两图像的相关系数
  • 图像相似度比对这个问题,在传统算法中常常转化为sift特征点比对的方法去做,主要是sift算法对图像的光照、旋转、位移等等具有比较强的鲁棒性,但是整体精度没有特别高。随着深度学习技术的发展,目前对这个问题的解...

    图像相似度比对这个问题,在传统算法中常常转化为sift特征点比对的方法去做,主要是sift算法对图像的光照、旋转、位移等等具有比较强的鲁棒性,但是整体精度没有特别高。随着深度学习技术的发展,目前对这个问题的解应该更加完美。所以最进在试图探究这个更加完美的解。

    直观思路有2条:一条是利用现成的pretrain_model计算图像的高维特征向量,然后对特征向量,计算余玄距离;另一条是针对特定场景数据,建立图像对的数据集,然后构建深度模型,直接学习相似度。

    先说下答案:两者效果整体上差不多,但各有优缺点。pretain_model余玄距离方式:优点很明显,不用准备打标数据集训练,直接预测,卡个阈值就能用,而且非常通用,适用几乎所有数据,缺点是准确率稍微低些(但实测对于高召回、低准确的应用场景基本够用了);针对特定场景数据训练方式:优点是可以针对特定场景数据集调优,精度可以达到我们想要的精度;缺点是耗时耗力、只针对特定场景、通用性差。

    下面简单说下技术方案。pretainmodel余玄距离方式基本不用说了,网上下载下pretrain_model,写个脚本预测下就可以了。有个很好的github工程:https://github.com/cameronfabbri/Compute-Features,下载下来就能用,很方便,可以快捷验证。我们重点说下针对特定场景数据训练方式。

    在利用基于深度学习进行相似度比对时,我重点参考了这篇paper:

    Learning to Compare Image Patches via Convolutional Neural Networks​arxiv.org

    文中有多种实验方案,归纳起来就2种:一种是对于图像对,用2个cnn分支分别抽取特征,然后concate起来,用全连接组织相似度判别器(其实就是分类器,相似或者不相似);另一种是只用1个cnn分支,将图像对组织成一幅2倍于输入图像通道数的“图像”,作为cnn网络的输入,输出端也是用全连接组织相似度判别器,得到相似度值。可分别用下面两张图表达这个意思:

    93c8c70cc1c9418af8d83f3d751c59be.png
    双分支单图通道结构

    703a24036268b2b30576b1fb35ac144f.png
    单分支双图通道结构

    文中重点实验了3种思路的网络结构,我也一一复现了下,效果最好的是2ch-2stream结构,其次是2ch-deep结构,最后是2ch结构。作者放出了每种结构的具体设计,分别如下:

    (i)2ch-2stream consists of two branches C(95,5,1)-ReLU-P(2,2)-C(96,3,1)-ReLU-P(2,2)-C(192,3,1)-ReLU-C(192,3,1)-ReLU, one for cen- tral and one for surround parts, followed by F(768)-ReLU-F(1)

    (ii) 2ch-deep = C(96,4,3)-Stack(96)-P(2,2)-Stack(192)-F(1), where Stack(n) = C(n, 3, 1)-ReLU-C(n, 3, 1)-ReLU-C(n, 3, 1)-ReLU.

    (iii) 2ch = C(96, 7, 3)-ReLU-P(2, 2)-C(192, 5, 1)-ReLU- P(2,2)-C(256,3,1)-ReLU-F(256)-ReLU-F(1)
    其中,效果最好的是2ch-2stream结构图如下,一目了然,非常好理解:

    60317940e5c796113ceba958feb0d495.png
    2ch-2stream结构

    说说我在调优过程中的优化点:

    1)图像对训练集的建立。首先准备1w左右的数据(里面可能有少量相似样本,占比不到0.1)。相异样本就是每次fead数据时从这1w数据中随机抽取2张;相同样本是从中随机抽取1张,以及用这1张图片随机增强的图片。

    2)文中用的公共数据集适合用64*64的输入,而我用的数据尺寸直接resize到64*64,信息损失会比较大。我统计了数据集所有图像的平均尺寸,得到适合的尺寸为:长=64,宽=256.

    3) 自建了一个具有代表性的验证集。一一实验2ch/2ch-deep/2ch-2stream三种结构发现,在验证集上效果恰恰与文中所述结论相反。判断是过拟合验证了。在全连接的地方接了dropout, 系数设成0.9。由于每次训练是随机样本对,随机1个epoch应该是1w1w。所以训练久点,泛化要好些,但不能过长。迭代3w轮,batch_size=128。

    最后,说下可能的优化点:

    1)这篇文章发表在2015年,当时各种神经网络奇技淫巧,都没出来。所以替换掉中间的特征抽取网络,效果肯定能提升。比如加入resnet-block。

    2)加上batch_normal,做正则。

    3) 还没有实验文中的spp,加上估计有提升,因为保证了分辨率。

    展开全文
  • 图像相似度计算(python)

    热门讨论 2012-09-23 22:51:57
    一个关于对图像相似度计算处理的python程序
  • 图像相似度_hist相似度_getrgbhist_RGB图像相似度_源码
  • ybt 1123:图像相似度 OpenJudge NOI 1.8 06:图像相似度 【题目考点】 1. 二维数组遍历 【题解代码】 解法1: 设数组a[N][N],数组长度N要大于等于二维数组长宽m与n。 a中存储数据的位置a[i][j]:i的范围0 ~ m - 1,...

    【题目链接】

    ybt 1123:图像相似度
    OpenJudge NOI 1.8 06:图像相似度

    【题目考点】

    1. 二维数组遍历

    【题解代码】

    解法1:

    设数组a[N][N],数组长度N要大于等于二维数组长宽m与n。
    a中存储数据的位置a[i][j]:i的范围0 ~ m - 1,j的范围0 ~ n - 1

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int m, n, s = 0, a[100][100], b[100][100];//s:相同像素点个数
        cin >> m >> n;
        for(int i = 0; i < m; ++i)//输入二维数组a
            for(int j = 0; j < n; ++j)
                cin >> a[i][j];
        for(int i = 0; i < m; ++i)//输入二维数组b
            for(int j = 0; j < n; ++j)
                cin >> b[i][j];
        for(int i = 0; i < m; ++i)//遍历二维数组每个位置,判断是否相等
            for(int j = 0; j < n; ++j)
            {
                if(a[i][j] == b[i][j])
                    s++;
            }
        cout << fixed << setprecision(2) << (double)s/(m*n)*100;
    	return 0;
    }
    

    解法2:

    设数组a[N][N],数组长度N要大于二维数组长宽m与n。(如m,n可能取到的最大值为100,数组长度N可设为101或105这种大于100的数,不能设为100)
    a中存储数据的位置a[i][j]:i的范围1 ~ m,j的范围1 ~ n

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int m, n, s = 0, a[105][105], b[105][105];//s:相同像素点个数
        scanf("%d %d", &m, &n);
        for(int i = 1; i <= m; ++i)//输入二维数组a
            for(int j = 1; j <= n; ++j)
                cin >> a[i][j];
        for(int i = 1; i <= m; ++i)//输入二维数组b
            for(int j = 1; j <= n; ++j)
                cin >> b[i][j];
        for(int i = 1; i <= m; ++i)//遍历二维数组每个位置,判断是否相等
            for(int j = 1; j <= n; ++j)
            {
                if(a[i][j] == b[i][j])
                    s++;
            }
        printf("%.2f", (double)s/(m*n)*100);
        return 0;
    }
    
    展开全文
  • 功能是:打开摄像头,鼠标选定一个框,框内图像作为标准图像,计算出其直方图并显示出来;然后继续鼠标选定框,该框内的图像的直方 ...图与标准图像的进行相似度计算,计算结果在终端输出,数值越大表示相似度越大。
  • 根据图像直方图来比较两幅图像的相似性。 比如有图像A和图像B,分别计算两幅图像的直方图,HistA,HistB,然后计算两个直方图的归一化相关系数(巴氏距离,直方图相交距离)等等。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,508
精华内容 14,603
关键字:

图像相似度