討論區快速選單
知識庫快速選單
政府補助!資策會APP就業班 程式設計俱樂部Facebook粉絲團 虛擬社群公民行為研究
[ 回上頁 ] [ 討論區發言規則 ]
比對圖片相似度
更改我的閱讀文章字型大小
作者 : kyosonic(草薙浩治)
[ 貼文 13 | 人氣 3853 | 評價 10 | 評價/貼文 0.77 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/6/1 下午 09:00:47
我要比對兩個圖片的相似度,是以比對RGB、像素做為基礎。不過出現的相似度數值跟實際肉眼看的感覺有點誤差,我舉個例子,像一張水質清澈的清水圖片和一張土黃色的水的圖片做比對,相似度跑出來只有10.xx%這OK,只是我再拿另一個水質也一樣清澈的圖片來跟原本的清水圖片來比對,結果相似度還是只有10.xx%,照理說相似度出來應該是要9x.xx%才對,詢問一下先進們要怎麼修正。
 private void cmdCompared_Click(object sender, EventArgs e)//開始比對
     {
     int rc, bc, gc;
     float cc = 0, hc = 0;
     for (int i = 0; i < y; i++)
     {
     for (int j = 0; j < x; j++)
     {
     rc = Math.Abs(clarityR[i, j] - checkR[i, j]);
     bc = Math.Abs(clarityB[i, j] - checkB[i, j]);
     gc = Math.Abs(clarityG[i, j] - checkG[i, j]);
     cc = (float)(rc + bc + gc);
     hc = cc / (765 * x * y) + hc;

     }
     }
     hc = hc * 100;
     textBox1.Text = Convert.ToString(hc);
     }
作者 : kyosonic(草薙浩治)
[ 貼文 13 | 人氣 3853 | 評價 10 | 評價/貼文 0.77 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/6/3 下午 04:33:04
更正,百分比部份是誤差不是相似度。
再補充一下上面的算法:
要對照的圖片每點的RGB 跟樣本圖片的RGB相減,765*x*y是圖片的RGB總值
hc的話就是cc/765*x*y的值之後,每處理一個點就存一次誤差值,弄累加就是為了將一個點的誤差和除以整個RGB總值全部加起來,再乘以100換成%,乘以100是讓0.01的誤差 *10 讓他變成整數的誤差%
作者 : booker(booker)
[ 貼文 59 | 人氣 7479 | 評價 120 | 評價/貼文 2.03 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kyosonic註記此篇回應為很有道理 2008/6/5 下午 03:00:02
影像比對有很多可以討論的 我就不多說了
你的方式是數位(digital)比對 把每一點的值抓出來比對
應該是一樣大小的圖吧
有兩處我不明白
> cc = (float)(rc + bc + gc);
> hc = cc / (765 * x * y) + hc;
765是啥? 256*3?

以你的想法 我加強一些 看看行不行

r,g,b
(0,0,0)(150,0,0) & (0,0,0)(50,50,50)
以上述方式 差異度是一樣的
想像(r,g,b)是座標上一點 差異度應該是"距離"
所以與(0,0,0)差異度應該是 (150*150)平方根 和 (50*50*3)平方根

以這方式去算所有點再加起來

那差異度多少?
找出最不像的當分母 也就是每一點的(r,g,b)的最大距離

-
不過 影像比對有很多需要考慮的 一般會針對特定的影像(人臉,風景等...)來做
所以 我也只是說說我的想法而已......

作者 : kagaya(kagaya) VC++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1486 | 人氣 38709 | 評價 4310 | 評價/貼文 2.9 | 送出評價 106 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kyosonic註記此篇回應為很有道理 2008/6/5 下午 05:09:56
hc = cc / (765 * x * y) + hc;
這一行改成
float f1 = (float)(765 * x * y);
hc += cc / f1;
看看
作者 : kyosonic(草薙浩治)
[ 貼文 13 | 人氣 3853 | 評價 10 | 評價/貼文 0.77 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/6/9 下午 11:42:25
先感謝各位先進的熱心,目前我是先試著將RGB三項分別列出誤差值,現在的話誤差值看起來就跟肉眼所見的比較相近。目前在計算部份是改成這樣:
 for (int i = 0; i < y; i++)
     {
     for (int j = 0; j < x; j++)
     {
     rc = Math.Abs(clarityR[i, j] - checkR[i, j]);
     bc = Math.Abs(clarityB[i, j] - checkB[i, j]);
     gc = Math.Abs(clarityG[i, j] - checkG[i, j]);
    
     float f1 = (float)(255 * x * y);
     float f2 = (float)(255 * x * y);
     float f3 = (float)(255 * x * y);
     hc1 += rc / f1;
     hc2 += bc / f2;
     hc3 += gc / f3;
     }
     }
booker大問到的765是啥? 256*3?應該說是255*3,我當初是想說以整張圖的RGB最大數值做為分母才先弄個255*3的。再來提到的方式讓我想到一點就是將RGB三個誤差值整合起來,整理成一個整體的誤差值。是否也可以用類似開根號的方式下去整理起來成一個整體的誤差值,比如說在hc3+=gc/f3;底下加上類似把hc1*hc2*hc3然後再開根號這種方式!?
作者 : bluetulip(BlueTulip) Visual Basic優秀好手貼文超過1000則人氣指數超過10000點
[ 貼文 1120 | 人氣 28366 | 評價 4070 | 評價/貼文 3.63 | 送出評價 15 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kyosonic註記此篇回應為很有道理 2008/6/10 上午 10:17:58
看不太懂..看得頭暈眼花..
是指說,你們把圖片每個的RGB值抓出來比對
然後看相符的比例有多少,就是相似度多少嗎?
我想最大的問題並不是在於你們RGB三個有沒有拆開的問題
而是在於,觀點有點盲點...

RGB=000000跟010000的差異
應該不是肉眼分辯的出來的吧?
所以,兩張同樣清澈水的照片
肉眼看相似,但程式跑起來只有1x%
個人覺得應該有個彈性範圍

其實還有其他蠻多需要注意的地方
可以去翻翻做影像處理的書籍參考看看..
作者 : kyosonic(草薙浩治)
[ 貼文 13 | 人氣 3853 | 評價 10 | 評價/貼文 0.77 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/6/22 上午 03:07:58
問題已經有解決,到現在才突然想到回來告知一下,感謝各位的講解。
我是把255*3*x*y那裡開始換成以樣本圖的RGB當分母這個想法下去改,改出來的數值有比較理想。
 板主 : 小朱
 > C# - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C# - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C#
1 小朱 6260 
2 蹂躪 2700 
3 HKLN.net 2440 
4 marlon 2130 
5 joe 1260 
6 識丁 910 
7 好說 860 
8 愛睏魚 770 
9 總幹事 720 
10 Demonbane 600 
C#
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625