2010-09-07 63 views
3

我想要減去兩個圖像。我的問題是cvSub()函數飽和。我想要做的是:通過使用opencv減去圖像

1)將原始圖像轉換爲灰度。

2)取灰度圖像(值從0-255)。

3)減去圖像(值從-255到255) - >使用cvSub()重新縮放的問題。

4)通過用0.5相乘並加入128

重新縮放我想從8位改變灰度圖像,以16位的,但隨後的一切變得更糟,併成爲許多行代碼和它到底沒有解決。

+0

醜陋的解決方案只是循環顯示圖像,並且每個像素自己做一次。這基本上只是用C++翻譯你的問題(甚至應該更短)。 – mb14 2010-09-07 08:55:43

回答

5

使用的OpenCV你可以執行以下操作:

  • 刻度既源圖像(1和2)通過係數0.5。兩個圖像現在是在範圍[0..127]
  • 移位圖像1由128現在是在範圍[128..255]
  • 減法圖像2從圖像1

這樣,不需要範圍轉換,結果可以完全縮放到8位。前兩個操作使用。

事情是這樣的:

//... 
cvConvertScale(src1, tmp1, 0.5, 128); 
cvConvertScale(src2, tmp2, 0.5, 0); 
cvSub(tmp1, tmp2, dst); 

編輯:

要在信息丟失(精度)的評論,你是對的,但你使用整數運算分割時總是這樣。在你的情況下擴大規模就是這樣。簡單地把它看作是把所有的位向右移動一個地方。所以最後一點信息就會丟失。

另一方面,應用操作的順序也很重要。除以2,您將爲每個像素引入一個舍入(或截斷)錯誤0.5。如果在減去輸入圖像之前縮小它們,則舍入誤差總計爲1.0。這顯示在結果圖像中,因爲與初始和Alexanders方法得到的結果相比,某些像素的偏移量爲1。但這是簡單解決方案的折衷方案,無需將圖像擴展到16位或浮點。

見下面的例子:

實數:
(200 - 101)/ 2 = 99/2 = 49。5

亞歷山大溶液(整數運算):
(200 - 101)/ 2 = 99/2 =

我的解決方案(整數運算):
(200/2) - (101/2)= 100 - 50 =

+1

感謝您的簡單解決方案!它解決了! - 好主意先做縮放,然後減去圖片。 – supergranu 2010-09-08 12:07:24

+0

唯一的問題是一個人丟失了信息。在這種情況下,最好選擇Alexander Rafferty的版本。 – supergranu 2010-09-09 06:59:02

+0

你能告訴我你在哪裏認爲,你信息鬆動嗎?你的意思是精確嗎? – 2010-09-09 07:01:10

1

您需要將8bit轉換爲16bit。 然後將255添加到第一張圖像,然後從中減去第二張圖像。 然後除以2並轉換回8位。

告訴我這是怎麼回事,它應該工作。