圖像相似度演算法
❶ 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、首先打開微信,選擇底部「發現」。如圖所示。