2012-11-21 78 views
0

我想比較PHP中的兩幅圖像。如果他們是95%或以上相似,那麼結果應該只是顯示文字是。如果他們不相似的結果應該是 沒有。所以比較PHP中的兩幅圖像

if () 
{ 
echo "Yes"; 
} 
else 
{ 
echo "No"; 
} 

任何方式這是迄今爲止我所發現的。 http://pastebin.com/wgeu2DqE 我想給你我在哪裏找到它,但你必須註冊。

現在我有這個功能加載圖像

function LoadPNG($imgname) 
{ 
    /* Attempt to open */ 
    $im = @imagecreatefrompng($imgname); 

    /* See if it failed */ 
    if(!$im) 
    { 
     /* Create a blank image */ 
     $im = imagecreatetruecolor(150, 30); 
     $bgc = imagecolorallocate($im, 255, 255, 255); 
     $tc = imagecolorallocate($im, 0, 0, 0); 

     imagefilledrectangle($im, 0, 0, 150, 30, $bgc); 

     /* Output an error message */ 
     imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc); 
    } 

    return $im; 
} 

我一直想在我的記事本+ +和phpdesigner拿出的東西,但我得到的錯誤。我不是一個PHP開發人員,所以我正在尋求你們的幫助。我只需要比較兩張圖片,然後選擇是或否。所以這很簡單。我也看到了這一點,但沒有意義。

Compare 2 images in php

感謝。

+1

我認爲圖像識別庫是你最好的選擇。根據您如何定義比較條件,比較圖像可能非常複雜。 – RonaldBarzell

+1

「95%以上相似」?我們需要一個「類似」的可靠定義 –

+0

你知道,像班上的人寫的東西(pastebin鏈接)。如果差值是0.95或以上,它們是相同的。如果不是,他們不是。如果你有更好的方式請告訴我。解釋圖像識別庫? – macroscripts

回答

1

您可以通過幾種方式進行比較,具體取決於您想要的比較類型和用例。 「相似」是一個非常含糊的術語。

有圖像比較庫,或者您可以使用ImageMagick函數。甚至還有一個用於PHP的OpenCV的綁定。

當然,這種方法越複雜,結果就越靈活,越好。

如果您比較兩幅應該相等但不相等的圖像(例如,兩個監控攝像頭框架),則可以使用下面給出的DIY方法。

如果色調和光度(如噪音)有變形,那麼DIY方法將不起作用,但ImageMagick會給出好的結果。

最後,如果您嘗試映射同一對象的兩個視圖,例如,從一隻腳向左移動的攝像頭,或者您正在尋找另一個「內部」的圖像等,那麼OpenCV是三者中唯一可行的替代方案。

一個自己動手的方法,對於最簡單的情況,可能是首先檢查兩個圖像的寬高比,然後減少到相同的大小(你可以進一步減少它們(比如說,縮放1:4)過濾掉小差異和/或減少前面的工作)。

在這一點上,您可以使用getColorAt(也可以選擇轉換爲灰度忽略色調差異)逐個像素地比較兩個圖像。兩個像素之間的距離也可以通過多種方式進行計算(例如使用CIE perceptual functions),或者您可以使用歐幾里德距離 - SQRT((r1-r2)* 2 +(g1-g2) * 2 +(b1-b2 )** 2)。

距離範圍從0到W * H * 255 * SQRT(3);您可以將這些值線性映射到0-100%的範圍。

這可以很容易地告訴你一個圖像和相同的圖像之間的區別,其上繪製了一些線條。如果你扭曲了圖像(例如用一個「捏」過濾器),或者旋轉一點,結果圖像將會出現95%甚至99%的相同,然而這種算法可能報告很低的匹配(對於照片質量的圖片,連續調,比賽依然會很好。對於漫畫,這將是非常可憐的)。

+0

現在我看到我應該提到我正在處理的圖像的質量。事情是我沒有這樣做高科技的東西,如相機框架。我這樣做是因爲我需要在我的電腦上比較兩個簡單的png圖像。其他程序語言失敗了,所以PHP原來是最簡單的解決方案。 我見過有關imagemagic的一些內容,但無法制作出一些東西。有沒有簡單的代碼就像我在這裏可以工作。 http://pastebin.com/wrsFBG8u 我設法寫這個,但我有一些錯誤,無法修復它們。那麼這個怎麼樣? – macroscripts

+0

你的'imagehex()'函數將一個數組作爲參數,但是你提供了一個從'LoadPNG'中取得的GD對象。 'imagehex()'似乎表現得好像它期望的圖像路徑一樣,除了'getImageSize()'不能使用'type'。代碼足以提出另一個問題(評論對於答案來說還不夠),但我認爲你甚至可能不需要這個問題。儘管如此,可以在(我的用戶名)(gmail)上與我聯繫。我不清楚你的第二個循環。 – LSerni

+0

我發現了一個對我來說足夠好的解決方案。我做了兩個圖像的MD5檢查,它的工作。這對我來說足夠了。 謝謝你們。並請有人評價我的帖子,以便我可以得分。 15點的限制阻止了我做更多的工作。 – macroscripts