计算图像相似度的算法有哪些
SIM=StructuralSIMilarity(结构相似性),这是一种用来评测图像质量的一种方法。
由于人类视觉很容易从图像中抽取出结构信息,因此计算两幅图像结构信息的相似性就可以用来作为一种检测图像质量的好坏.首先结构信息不应该受到照明的影响,因此在计算结构信息时需要去掉亮度信息,即需要减掉图像的均值;其次结构信息不应该受到图像对比度的影响,因此计算结构信息时需要归一化图像的方差;最后我们就可以对图像求取结构信息了,通常我们可以简单地计算一下这两幅处理后的图像的相关系数.然而图像质量的好坏也受到亮度信息和对比度信息的制约,因此在计算图像质量好坏时,在考虑结构信息的同时也需要考虑这两者的影响.通常使用的计算方法如下,其中C1,C2,C3用来增加计算结果的稳定性:2u(x)u(y)+C1L(X,Y)=------------------------,u(x),u(y)为图像的均值u(x)^2+u(y)^2+C12d(x)d(y)+C2C(X,Y)=------------------------,d(x),d(y)为图像的方差d(x)^2+d(y)^2+C2d(x,y)+C3S(X,Y)=----------------------,d(x,y)为图像x,y的协方差d(x)d(y)+C3而图像质量Q=[L(X,Y)^a]x[C(X,Y)^b]x[S(X,Y)^c],其中a,b,c分别用来控制三个要素的重要性,为了计算方便可以均选择为1,C1,C2,C3为比较小的数值,通常C1=(K1xL)^2,C2=(K2xL)^2,C3=C2/2,K1。
谷歌人工智能写作项目:小发猫
C#怎么来判断2张图片相似度
很麻烦,而且计算量很大,这个属于人工智能的范畴神经网络k值是什么,神经网络中的阈值是什么。如果这“两张相似图片”可以规定很多前提,比如相同分辨率,黑白,简单几何图形。。。
那么可以用基本的算法去算一下“相似度”,也就是楼上说的,读取两张照片的像素点,然后遍历去对比灰度差值。
这些有很多现成的算法,也有很多网站提供这方面的计算(直接调用API即可),但是只能得出数字化的“相似度”。如果你要的就是两张图片像素点之间的差异,那么就去找算法即可实现。
看一参考这个网站:这个是国外比较知名的图像处理的网站。但是,两张图片如果尺寸不一呢?如果比例不一样呢?如果有留白呢?彩色的呢?
所以目前最成熟的编程算法也就是识别一下字母和数字(比如谷歌可以识别照片上的门牌号和街道号),人脸识别也只是拿几个标本部位来大致判断相似度(眼睛的大小,鼻梁的高度,脸颊的宽瘦和比例),以人眼的标准完整的去比较两张图片是否一样是很难的,目前应该还没有这方面成熟的技术。
C#灰度图像通过相似度算法找出相似度最高的图片
。
这种以图搜图可以用感知哈希算法,第一步缩小图片尺寸将图片缩小到8x8的尺寸,总共64个像素.这一步的作用是去除各种图片尺寸和图片比例的差异,只保留结构、明暗等基本信息.第二步转为灰度图片将缩小后的图片,转为64级灰度图片.第三步计算灰度平均值计算图片中所有像素的灰度平均值第四步比较像素的灰度将每个像素的灰度与平均值进行比较,如果大于或等于平均值记为1,小于平均值记为0.第五步计算哈希值将上一步的比较结果,组合在一起,就构成了一个64位的二进制整数,这就是这张图片的指纹.第六步对比图片指纹得到图片的指纹后,就可以对比不同的图片的指纹,计算出64位中有多少位是不一样的.如果不相同的数据位数不超过5,就说明两张图片很相似,如果大于10,说明它们是两张不同的图片.具体的c#代码可以看usingSystem;using;usingSystem.Drawing;namespaceSimilarPhoto{classSimilarPhoto{ImageSourceImg;publicSimilarPhoto(stringfilePath){SourceImg=Image.FromFile(filePath);}publicSimilarPhoto(Streamstream){SourceImg=Image.FromStream(stream);}publicStringGetHash(){Imageimage=ReduceSize();Byte[]grayValues=ReduceColor(image);Byteaverage=CalcAverage(grayValues);Stringreslut=ComputeBits(grayValues,average);returnreslut;}//Step1:Reducesizeto8*8privateImageReduceSize(intwidth=8,intheight=8){Imageimage=SourceImg.GetThumbnailImage(width,height,()=>{returnfalse;},);returnimage;}//Step2:ReduceColorprivateByte[]ReduceColor(Imageimage){BitmapbitMap=newBitmap(image);Byte[]grayValues=newByte[image.Width*image.Height];for(intx=0;x。
百度识图原理?
。
百度识图原理:对于这种百度,谷歌的图像搜索一般由算法实现,一般是三个步骤:1.将目标图片进行特征提取,描述图像的算法很多,用的比较多的是:SIFT描述子,指纹算法函数,bundlingfeatures算法,hashfunction(散列函数)等。
也可以根据不同的图像,设计不同的算法,比如图像局部N阶矩的方法提取图像特征。2.将图像特征信息进行编码,并将海量图像编码做查找表。
对于目标图像,可以对分辨率较大的图像进行降采样,减少运算量后在进行图像特征提取和编码处理。
3.相似度匹配运算:利用目标图像的编码值,在图像搜索引擎中的图像数据库进行全局或是局部的相似度计算;根据所需要的鲁棒性,设定阈值,然后将相似度高的图片预保留下来;最后应该还有一步筛选最佳匹配图片,这个应该还是用到特征检测算法。
其中每个步骤都有很多算法研究,围绕数学,统计学,图像编码,信号处理等理论进行研究。
现在人脸识别最有效的算法是什么?
最好的人脸识别系统在理想情况下比人类识别的表现要好的多。但是一旦环境情况变糟,系统的表现就差强人意了。而计算机科学家们当然是非常想要开发出一种算法,在各种情况下都能够表现优异。
现在,中国香港大学的汤晓鸥教授和他的学生路超超(音译)宣布他们攻克了这个难题。他们开发了一种叫“高斯”的人脸识别算法首次超过了人类自身。
新的识别系统对于各种平台都能够提供人类级别的识别能力,从手机到电脑游戏中的人脸识别,从安全系统到密码控制等等。任何一个人脸自动识别程序,首先要考虑的就是去构建一个合适的数据集来测试算法。
那需要一个非常大范围的,各种各样的,带着各种复杂动作、光线和表情的,不同脸的图像,各种人种、年龄和性别都要考虑在内。然后还要考察服装、发型以及化妆等其他因素的影响。
比较幸运的是,已经有这么一个拥有各种不同人脸的标准数据库——LabelledFaces。它拥有超过13,000张不同人脸的图片,它们是从网络上收集的6000个不同的公众人物。
更重要的是,每个人都拥有不止一张人脸图片。当然也存在其他的人脸数据库,但是Labelledfaces目前是计算机科学家们所公认的最具参考价值的测试数据集。
面部识别的任务是去比较两张不同的图片,然后判断他们是否是同一个人。(你可以试试看,能否看出这里展示的每对图片是否是同一个人。)人类在这个数据库上的表现可以达到97.53%的准确度。
但是没有任何一个计算机算法能够达到这个成绩。直到这个新算法的出现。新的算法依照5点图片特征,把每张脸图规格化成一个150*120的像素图,这些特征分别是:两只眼睛、鼻子和嘴角的位置。
然后,算法把每张图片划分成重叠的25*25像素的区域,并用一个数学向量来描述每一个区域的基本特征。做完了这些,就可以比较两张图片的相似度了。但是首先需要知道的是到底要比较什么。
这个时候就需要用到训练数据集了。一般的方法是使用一个独立的数据集来训练算法,然后用同一个数据集中的图片来测试算法。但是当算法面对训练集中完全不同的两张图片的时候,经常都会识别失败。
“当图片的分布发生改变的时候,这种训练方法就一点都不好了。”超超和晓鸥说到。相反,他们用四个拥有不同图片的,完全不同的数据集来测试“高斯”算法。
举个例子,其中一个数据集是著名的Multi-PIE数据库,它包含了337个不同的物体,从15种不同的角度,在19种不同的光照情况下,分别拍摄4组图片。
另一个数据库叫做LifePhotes包含400个不同的人物,每个人物拥有10张图片。用这些数据库训练了算法后,他们最终让新算法在LabelledFaces数据库上进行测试。
目标是去识别出所有匹配和不匹配的图片对。请记住人类在这个数据库上的表现是97.53%的精确度。“我们的“高斯”算法能够达到98.52%的精确度,这也是识别算法第一次击败人类。”超超和晓鸥说到。
这是一个令人印象深刻的结果,因为数据中的照片包含各种各样不同的情况。超超和晓鸥指出,仍然有很多挑战在等着他们。现实情况中,人们可以利用各种附加的线索来识别,比如脖子和肩膀的位置。
“超过人类的表现也许只是一个象征性的成就罢了”他们说。另一个问题是花费在训练新算法上的时间,还有算法需要的内存大小以及识别两幅图所需要的时间。这可以用并行计算和特制处理器等技术来加快算法的运行时间。
总之,精确的人脸自动识别算法已经到来了,而且鉴于现在的事实,这只会更快。
图片相似度检索 100
介个课题应该是比较有难度挑战的。毕竟人工智能的水平没有这么发达。现在的搜索引擎上面,“图片搜索”实际上是“图片解说文字搜索”,离真正的图像相似检索,还差得远呢。
你的这一串数字应该是两个图像的不同特征数字吧,比如颜色,轮廓,名称等等,你滴数字长度很长,复杂的算法也不现实。
可以分段求相关系数,具体可以参考概率统计里边相关系数的概念,下面是matlab指令的corrcoef的效果A=12345678910>>BB=1.00002.00002.90004.00005.00006.20007.00008.00009.000010.0000>>C=corrcoef(A,B)C=1.00000.99970.99971.0000求相关系数,具体实现的时候可以有简化或快速算法,这都可以仔细斟酌的。
有什么可以对比两张图片得出相似度的软件。
如何通过人工神经网络实现图像识别
。
人工神经网络(ArtificialNeuralNetworks)(简称ANN)系统从20世纪40年代末诞生至今仅短短半个多世纪,但由于他具有信息的分布存储、并行处理以及自学习能力等优点,已经在信息处理、模式识别、智能控制及系统建模等领域得到越来越广泛的应用。
尤其是基于误差反向传播(ErrorBackPropagation)算法的多层前馈网络(Multiple-LayerFeedforwardNetwork)(简称BP网络),可以以任意精度逼近任意的连续函数,所以广泛应用于非线性建模、函数逼近、模式分类等方面。
目标识别是模式识别领域的一项传统的课题,这是因为目标识别不是一个孤立的问题,而是模式识别领域中大多数课题都会遇到的基本问题,并且在不同的课题中,由于具体的条件不同,解决的方法也不尽相同,因而目标识别的研究仍具有理论和实践意义。
这里讨论的是将要识别的目标物体用成像头(红外或可见光等)摄入后形成的图像信号序列送入计算机,用神经网络识别图像的问题。
一、BP神经网络BP网络是采用Widrow-Hoff学习算法和非线性可微转移函数的多层网络。一个典型的BP网络采用的是梯度下降算法,也就是Widrow-Hoff算法所规定的。
backpropagation就是指的为非线性多层网络计算梯度的方法。一个典型的BP网络结构如图所示。我们将它用向量图表示如下图所示。
其中:对于第k个模式对,输出层单元的j的加权输入为该单元的实际输出为而隐含层单元i的加权输入为该单元的实际输出为函数f为可微分递减函数其算法描述如下:(1)初始化网络及学习参数,如设置网络初始权矩阵、学习因子等。
(2)提供训练模式,训练网络,直到满足学习要求。(3)前向传播过程:对给定训练模式输入,计算网络的输出模式,并与期望模式比较,若有误差,则执行(4);否则,返回(2)。
(4)后向传播过程:a.计算同一层单元的误差;b.修正权值和阈值;c.返回(2)二、BP网络隐层个数的选择对于含有一个隐层的三层BP网络可以实现输入到输出的任何非线性映射。
增加网络隐层数可以降低误差,提高精度,但同时也使网络复杂化,增加网络的训练时间。误差精度的提高也可以通过增加隐层结点数来实现。一般情况下,应优先考虑增加隐含层的结点数。
三、隐含层神经元个数的选择当用神经网络实现网络映射时,隐含层神经元个数直接影响着神经网络的学习能力和归纳能力。
隐含层神经元数目较少时,网络每次学习的时间较短,但有可能因为学习不足导致网络无法记住全部学习内容;隐含层神经元数目较大时,学习能力增强,网络每次学习的时间较长,网络的存储容量随之变大,导致网络对未知输入的归纳能力下降,因为对隐含层神经元个数的选择尚无理论上的指导,一般凭经验确定。
四、神经网络图像识别系统人工神经网络方法实现模式识别,可处理一些环境信息十分复杂,背景知识不清楚,推理规则不明确的问题,允许样品有较大的缺损、畸变,神经网络方法的缺点是其模型在不断丰富完善中,目前能识别的模式类还不够多,神经网络方法允许样品有较大的缺损和畸变,其运行速度快,自适应性能好,具有较高的分辨率。
神经网络的图像识别系统是神经网络模式识别系统的一种,原理是一致的。一般神经网络图像识别系统由预处理,特征提取和神经网络分类器组成。预处理就是将原始数据中的无用信息删除,平滑,二值化和进行幅度归一化等。
神经网络图像识别系统中的特征提取部分不一定存在,这样就分为两大类:①有特征提取部分的:这一类系统实际上是传统方法与神经网络方法技术的结合,这种方法可以充分利用人的经验来获取模式特征以及神经网络分类能力来识别目标图像。
特征提取必须能反应整个图像的特征。但它的抗干扰能力不如第2类。
②无特征提取部分的:省去特征抽取,整副图像直接作为神经网络的输入,这种方式下,系统的神经网络结构的复杂度大大增加了,输入模式维数的增加导致了网络规模的庞大。
此外,神经网络结构需要完全自己消除模式变形的影响。但是网络的抗干扰性能好,识别率高。当BP网用于分类时,首先要选择各类的样本进行训练,每类样本的个数要近似相等。
其原因在于一方面防止训练后网络对样本多的类别响应过于敏感,而对样本数少的类别不敏感。另一方面可以大幅度提高训练速度,避免网络陷入局部最小点。
由于BP网络不具有不变识别的能力,所以要使网络对模式的平移、旋转、伸缩具有不变性,要尽可能选择各种可能情况的样本。
例如要选择不同姿态、不同方位、不同角度、不同背景等有代表性的样本,这样可以保证网络有较高的识别率。
构造神经网络分类器首先要选择适当的网络结构:神经网络分类器的输入就是图像的特征向量;神经网络分类器的输出节点应该是类别数。隐层数要选好,每层神经元数要合适,目前有很多采用一层隐层的网络结构。
然后要选择适当的学习算法,这样才会有很好的识别效果。
在学习阶段应该用大量的样本进行训练学习,通过样本的大量学习对神经网络的各层网络的连接权值进行修正,使其对样本有正确的识别结果,这就像人记数字一样,网络中的神经元就像是人脑细胞,权值的改变就像是人脑细胞的相互作用的改变,神经网络在样本学习中就像人记数字一样,学习样本时的网络权值调整就相当于人记住各个数字的形象,网络权值就是网络记住的内容,网络学习阶段就像人由不认识数字到认识数字反复学习过程是一样的。
神经网络是按整个特征向量的整体来记忆图像的,只要大多数特征符合曾学习过的样本就可识别为同一类别,所以当样本存在较大噪声时神经网络分类器仍可正确识别。
在图像识别阶段,只要将图像的点阵向量作为神经网络分类器的输入,经过网络的计算,分类器的输出就是识别结果。五、仿真实验1、实验对象本实验用MATLAB完成了对神经网络的训练和图像识别模拟。
从实验数据库中选择0~9这十个数字的BMP格式的目标图像。图像大小为16×8像素,每个目标图像分别加10%、20%、30%、40%、50%大小的随机噪声,共产生60个图像样本。
将样本分为两个部分,一部分用于训练,另一部分用于测试。实验中用于训练的样本为40个,用于测试的样本为20个。随机噪声调用函数randn(m,n)产生。
2、网络结构本试验采用三层的BP网络,输入层神经元个数等于样本图像的象素个数16×8个。隐含层选24个神经元,这是在试验中试出的较理想的隐层结点数。
输出层神经元个数就是要识别的模式数目,此例中有10个模式,所以输出层神经元选择10个,10个神经元与10个模式一一对应。
3、基于MATLAB语言的网络训练与仿真建立并初始化网络%================S1=24;%隐层神经元数目S1选为24[R,Q]=size(numdata);[S2,Q]=size(targets);F=numdata;P=double(F);net=newff(minmax(P),[S1S2],{'logsig''logsig'},'traingda','learngdm')这里numdata为训练样本矩阵,大小为128×40,targets为对应的目标输出矩阵,大小为10×40。
newff(PR,[S1S2…SN],{TF1TF2…TFN},BTF,BLF,PF)为MATLAB函数库中建立一个N层前向BP网络的函数,函数的自变量PR表示网络输入矢量取值范围的矩阵[Pminmax];S1~SN为各层神经元的个数;TF1~TFN用于指定各层神经元的传递函数;BTF用于指定网络的训练函数;BLF用于指定权值和阀值的学习函数;PF用于指定网络的性能函数,缺省值为‘mse’。
设置训练参数net.performFcn='sse';%平方和误差性能函数=0.1;%平方和误差目标=20;%进程显示频率net.trainParam.epochs=5000;%最大训练步数=0.95;%动量常数网络训练net=init(net);%初始化网络[net,tr]=train(net,P,T);%网络训练对训练好的网络进行仿真D=sim(net,P);A=sim(net,B);B为测试样本向量集,128×20的点阵。
D为网络对训练样本的识别结果,A为测试样本的网络识别结果。实验结果表明:网络对训练样本和对测试样本的识别率均为100%。如图为64579五个数字添加50%随机噪声后网络的识别结果。
六、总结从上述的试验中已经可以看出,采用神经网络识别是切实可行的,给出的例子只是简单的数字识别实验,要想在网络模式下识别复杂的目标图像则需要降低网络规模,增加识别能力,原理是一样的。
Java 如何对比两张图片的相似度
如果觉得《图片相似度识别算法公式 图片相似度检测算法》对你有帮助,请点赞、收藏,并留下你的观点哦!