当前位置:首页 » 操作系统 » 图像相似度算法

图像相似度算法

发布时间: 2022-04-26 12:04:34

❶ C#怎么来判断2张图片相似度

很麻烦,而且计算量很大,这个属于人工智能的范畴。

如果这“两张相似图片”可以规定很多前提,比如相同分辨率,黑白,简单几何图形。。。那么可以用基本的算法去算一下“相似度”, 也就是楼上说的,读取两张照片的像素点,然后遍历去对比灰度差值。这些有很多现成的算法,也有很多网站提供这方面的计算(直接调用API即可),但是只能得出数字化的“相似度”。


如果你要的就是两张图片像素点之间的差异,那么就去找算法即可实现。

看一参考这个网站:www.aforgenet.com 这个是国外比较知名的图像处理的网站。


但是,两张图片如果尺寸不一呢? 如果比例不一样呢? 如果有留白呢?彩色的呢?

所以目前最成熟的编程算法也就是识别一下字母和数字(比如谷歌可以识别照片上的门牌号和街道号),人脸识别也只是拿几个标本部位来大致判断相似度(眼睛的大小,鼻梁的高度,脸颊的宽瘦和比例), 以人眼的标准完整的去比较两张图片是否一样是很难的,目前应该还没有这方面成熟的技术。

❷ 如何使用opencv中的NCC算法实现两幅图像的相似性判断

图像相似度计算之哈希值方法OpenCV实现

分类: OpenCV Image Processing 2014-12-25 21:27 180人阅读 评论(0) 收藏 举报
感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。
实现步骤:
1. 缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;
2. 简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;
3. 计算平均值:计算所有64个像素的灰度平均值;
4. 比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;
5. 计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;
6. 得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。
以上内容摘自:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html

下面是用OpenCV实现的测试代码:
[cpp] view plainprint?
string strSrcImageName = "src.jpg";

cv::Mat matSrc, matSrc1, matSrc2;

matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_COLOR);
CV_Assert(matSrc.channels() == 3);

cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);
//cv::flip(matSrc1, matSrc1, 1);
cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);

cv::Mat matDst1, matDst2;

cv::resize(matSrc1, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);
cv::resize(matSrc2, matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);

cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);
cv::cvtColor(matDst2, matDst2, CV_BGR2GRAY);

int iAvg1 = 0, iAvg2 = 0;
int arr1[64], arr2[64];

for (int i = 0; i < 8; i++) {
uchar* data1 = matDst1.ptr<uchar>(i);
uchar* data2 = matDst2.ptr<uchar>(i);

int tmp = i * 8;

for (int j = 0; j < 8; j++) {
int tmp1 = tmp + j;

arr1[tmp1] = data1[j] / 4 * 4;
arr2[tmp1] = data2[j] / 4 * 4;

iAvg1 += arr1[tmp1];
iAvg2 += arr2[tmp1];
}
}

iAvg1 /= 64;
iAvg2 /= 64;

for (int i = 0; i < 64; i++) {
arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;
}

int iDiffNum = 0;

for (int i = 0; i < 64; i++)
if (arr1[i] != arr2[i])
++iDiffNum;

cout<<"iDiffNum = "<<iDiffNum<<endl;

if (iDiffNum <= 5)
cout<<"two images are very similar!"<<endl;
else if (iDiffNum > 10)
cout<<"they are two different images!"<<endl;
else
cout<<"two image are somewhat similar!"<<endl;
string strSrcImageName = "src.jpg";

cv::Mat matSrc, matSrc1, matSrc2;

matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_COLOR);
CV_Assert(matSrc.channels() == 3);

cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);
//cv::flip(matSrc1, matSrc1, 1);
cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);

cv::Mat matDst1, matDst2;

cv::resize(matSrc1, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);
cv::resize(matSrc2, matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);

cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);
cv::cvtColor(matDst2, matDst2, CV_BGR2GRAY);

int iAvg1 = 0, iAvg2 = 0;
int arr1[64], arr2[64];

for (int i = 0; i < 8; i++) {
uchar* data1 = matDst1.ptr<uchar>(i);
uchar* data2 = matDst2.ptr<uchar>(i);

int tmp = i * 8;

for (int j = 0; j < 8; j++) {
int tmp1 = tmp + j;

arr1[tmp1] = data1[j] / 4 * 4;
arr2[tmp1] = data2[j] / 4 * 4;

iAvg1 += arr1[tmp1];
iAvg2 += arr2[tmp1];
}
}

iAvg1 /= 64;
iAvg2 /= 64;

for (int i = 0; i < 64; i++) {
arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;
}

int iDiffNum = 0;

for (int i = 0; i < 64; i++)
if (arr1[i] != arr2[i])
++iDiffNum;

cout<<"iDiffNum = "<<iDiffNum<<endl;

if (iDiffNum <= 5)
cout<<"two images are very similar!"<<endl;
else if (iDiffNum > 10)
cout<<"they are two different images!"<<endl;
else
cout<<"two image are somewhat similar!"<<endl;

❸ 计算图像相似度的算法有哪些

SIM = Structural SIMilarity(结构相似性),这是一种用来评测图像质量的一种方法。由于人类视觉很容易从图像中抽取出结构信息,因此计算两幅图像结构信息的相似性就可以用来作为一种检测图像质量的好坏.

首先结构信息不应该受到照明的影响,因此在计算结构信息时需要去掉亮度信息,即需要减掉图像的均值;其次结构信息不应该受到图像对比度的影响,因此计算结构信息时需要归一化图像的方差;最后我们就可以对图像求取结构信息了,通常我们可以简单地计算一下这两幅处理后的图像的相关系数.

然而图像质量的好坏也受到亮度信息和对比度信息的制约,因此在计算图像质量好坏时,在考虑结构信息的同时也需要考虑这两者的影响.通常使用的计算方法如下,其中C1,C2,C3用来增加计算结果的稳定性:
2u(x)u(y) + C1
L(X,Y) = ------------------------ ,u(x), u(y)为图像的均值
u(x)^2 + u(y)^2 + C1

2d(x)d(y) + C2
C(X,Y) = ------------------------,d(x),d(y)为图像的方差
d(x)^2 + d(y)^2 + C2

d(x,y) + C3
S(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=(K1 x L)^2, C2=(K2 xL)^2, C3 = C2/2, K1 << 1, K2 << 1, L为像素的最大值(通常为255).
希望对你能有所帮助。

❹ 图像怎么进行比对

图像比对是以原件的图像为基准,对待鉴定件图像进行预处理、定位、配准;再对原件及待鉴定件的图像进行相似度比对;计算出两者的相似度数值。

❺ 求助,如何对两幅二值图像进行相似度匹配

差分就是相减的意思,你可以对两幅图像进行对应位置的像素值相减操作,也可以在一幅图像里对某个区域内的像素值进行相减操作,得到所说的差分图像

❻ 相似度分析包含哪些算法

SIM = Structural SIMilarity(结构相似性),这是一种用来评测图像质量的一种方法。由于人类视觉很容易从图像中抽取出结构信息,因此计算两幅图像结构信息的相似性就可以用来作为一种检测图像质量的好坏. 首先结构信息不应该受到照明的影响,

❼ 如何求压缩后图像与原始图像相近程度

图像相似度计算主要用于对于两幅图像之间内容的相似程度进行打分,根据分数的高低来判断图像内容的相近程度。

可以用于计算机视觉中的检测跟踪中目标位置的获取,根据已有模板在图像中找到一个与之最接近的区域。然后一直跟着。已有的一些算法比如BlobTracking,Meanshift,Camshift,粒子滤波等等也都是需要这方面的理论去支撑。

还有一方面就是基于图像内容的图像检索,也就是通常说的以图检图。比如给你某一个人在海量的图像数据库中罗列出与之最匹配的一些图像,当然这项技术可能也会这样做,将图像抽象为几个特征值,比如Trace变换,图像哈希或者Sift特征向量等等,来根据数据库中存得这些特征匹配再返回相应的图像来提高效率。

下面就一些自己看到过的算法进行一些算法原理和效果上的介绍。

(1)直方图匹配。

比如有图像A和图像B,分别计算两幅图像的直方图,HistA,HistB,然后计算两个直方图的归一化相关系数(巴氏距离,直方图相交距离)等等。

这种思想是基于简单的数学上的向量之间的差异来进行图像相似程度的度量,这种方法是目前用的比较多的一种方法,第一,直方图能够很好的归一化,比如通常的256个bin条的。那么两幅分辨率不同的图像可以直接通过计算直方图来计算相似度很方便。而且计算量比较小。

这种方法的缺点:

1、直方图反映的是图像像素灰度值的概率分布,比如灰度值为200的像素有多少个,但是对于这些像素原来的位置在直方图中并没有体现,所以图像的骨架,也就是图像内部到底存在什么样的物体,形状是什么,每一块的灰度分布式什么样的这些在直方图信息中是被省略掉得。那么造成的一个问题就是,比如一个上黑下白的图像和上白下黑的图像其直方图分布是一模一样的,其相似度为100%。

2、两幅图像之间的距离度量,采用的是巴氏距离或者归一化相关系数,这种用分析数学向量的方法去分析图像本身就是一个很不好的办法。

3、就信息量的道理来说,采用一个数值来判断两幅图像的相似程度本身就是一个信息压缩的过程,那么两个256个元素的向量(假定直方图有256个bin条)的距离用一个数值表示那么肯定就会存在不准确性。

下面是一个基于直方图距离的图像相似度计算的Matlab Demo和实验结果.
%计算图像直方图距离
%巴氏系数计算法
M=imread('1.jpg');
N=imread('2.jpg');
I=rgb2gray(M);
J=rgb2gray(N);
[Count1,x]=imhist(I);
[Count2,x]=imhist(J);
Sum1=sum(Count1);Sum2=sum(Count2);
Sumup = sqrt(Count1.*Count2);
SumDown = sqrt(Sum1*Sum2);
Sumup = sum(Sumup);
figure(1);
subplot(2,2,1);imshow(I);
subplot(2,2,2);imshow(J);
subplot(2,2,3);imhist(I);
subplot(2,2,4);imhist(J);
HistDist=1-sqrt(1-Sumup/SumDown)

❽ 急急急!求matlab图像求二值图像相似度,在线等!

图像1和2为RGB图,放在m文件夹下;直接输入二值的话就不用im2bw了,pio是相似比

I1=imread('1.jpg');
I2=imread('2.jpg');
I1_bw=im2bw(I1);%%二值化
I2_bw=im2bw(I2);
[h,w]=size(I1_bw);%%获取图的宽高h/w
sum=0;
for i=1:h
for j=1:w

if I1_bw(i,j)==I2_bw(i,j)%%逐点比较相似
sum=sum+1;
end

end
end

pio=double(sum)/h/w;

❾ 有什么可以对比两张图片得出相似度的软件。

呵呵,这个软件我还真有,DuplicatePhotoFinder-这个软件不旦可以找相同图片还可以找相似图片的软件哟
名字不一样,大小不一样都能找得出来。只要内容相同或相似!我经常用这个软件清理我的图片

❿ 怎么对比两张图片的相似度

1、首先打开微信,选择底部“发现”。如图所示。

热点内容
php字符数字比较 发布:2024-10-03 19:09:11 浏览:606
批量分发命令脚本 发布:2024-10-03 19:08:20 浏览:219
wds服务器拉黑了怎么办 发布:2024-10-03 18:50:12 浏览:819
英雄联盟盒子源码 发布:2024-10-03 18:46:00 浏览:18
erlang并发编程 发布:2024-10-03 18:41:50 浏览:560
手机存储空间用不了 发布:2024-10-03 18:40:03 浏览:986
怎么知道支付宝的账号和密码忘了怎么办 发布:2024-10-03 18:40:02 浏览:606
电脑术语服务器是什么意思 发布:2024-10-03 18:38:33 浏览:347
安卓版本如何下载两个微信 发布:2024-10-03 18:21:30 浏览:212
webview跨域android 发布:2024-10-03 18:16:22 浏览:207