2011-01-28 44 views
1

我已經實現了一種方法,該方法將輸入圖像翻過垂直線並穿過中心並將其保存到輸出圖像文件。所以左邊的是什麼在右邊,反之亦然。圖像看起來很棒,看起來很完美。但是,我們給出了它應該看起來像的實際翻轉圖像文件,並且我在終端中使用了diff實用程序來比較這兩個圖像,並指出確實存在差異。使用一個名爲Kaliedoscope的程序,我能夠發現不同之處:有一些像素由於某種原因被染成與它們應該不同的顏色。不知道爲什麼。我的代碼甚至不會操縱RGB值。圖像處理程序中的微小圖像差異

+3

在進行比較之前,您是否將圖像保存爲有損格式,如.jpg? – 2011-01-28 03:38:44

+0

這些像素有何不同?它對人眼來說看起來是否合適,但是像素的顏色有很小的實際差異?或者你能否告訴他們不同? – mgiuca 2011-01-28 03:41:23

+0

你比較哪些樣本圖像?例如,是否有可能在翻轉時使用某種平滑算法 - 雙線性或雙三次?就計算機而言,這會稍微改變單個像素的顏色值,但對人眼而言是不可感知的。 – 2011-01-28 03:45:51

回答

1

你保存爲什麼圖像格式?如果您使用了有損壓縮(如JPEG),則圖像顏色將總是略有不同,因爲它們已被重新壓縮。您應該使用非有損格式,例如PNG。

您也不應該使用'diff'來查看圖像。我不知道萬花筒是什麼,但ImageMagick的「比較」工具適合查看兩幅圖像之間的差異。 'diff'幾乎總是會告訴你兩個圖像之間存在差異,即使它們是相同的,而且您使用的是非有損格式,因爲當您重新壓縮它時,它可能會使用不同的壓縮技術。

另外,你說你給了翻轉的圖像文件(假設這是一個家庭作業)。在這種情況下,生成該文件的人有可能犯了錯誤(例如,使用有損壓縮)。在這種情況下,我不會擔心細微的像素差異。

0

如果你的函數運行良好,它應該是它自己的逆(作爲一個必要條件,儘管不足以證明正確性)。

檢查

a == flipleft(flipleft(a)) 

如果你所信任的第三方測試軟件存在bug?

HTH!

編輯

同時檢查圖像的垂直中心,可以肯定的是,當水平像素數爲偶數,你在中間交換兩種。

0

你的代碼似乎沒有任何明顯的錯誤。

由於您有參考圖像,因此您可以告訴精確像素位置哪裏存在差異。我建議你用調試器(gdb,如果你是一個Linux用戶,或Visual Studio,如果這是漂浮你的船)通過你的程序,並在問題位置的代碼內循環中放置斷點。使用這些斷點,找出程序中出現問題的第一點。這將幫助您找到原因。

處理較小的圖像(每次迭代時可以打印到命令行的內容,例如8x8像素)可能會爲您節省一些調試時間。

發佈圖像可能會很好 - 您的結果和預期的參考。

0

修改您的代碼,以便將輸入圖像讀入Image,然後將其寫入輸出文件(無反轉)並將輸入文件與輸出文件進行比較。

如果它們不匹配那麼文件 - >圖像 - >文件進程正在破壞數據(可能是像素成員大小錯誤,導致四捨五入或使用未初始化的內存)或比較器(例如萬花筒)是錯誤的,您可以通過複製輸入文件和比較來進行測試。

如果它們匹配那麼無論你的逆轉過程是錯誤的(這似乎不大可能)或參考文件(該文件輸出「應該看起來像」)是錯誤的,你可以通過改變代碼來測試請參閱參考文件,並報告第一個分歧 - 即構造三個Images,Before(從輸入文件讀取),After(將寫入輸出文件)和Reference(從參考文件),然後遍歷x和y,比較After(x,y)和Reference(x,y)。只要你發現不一致,看看哪一個匹配Before(width-x-1,y);如果引用匹配,那麼你的反轉例程是錯誤的,如果匹配後參考文件是錯誤的(你可以指向一個像素來證明它)。