我想要減去兩個圖像。我的問題是cvSub()函數飽和。我想要做的是:通過使用opencv減去圖像
1)將原始圖像轉換爲灰度。
2)取灰度圖像(值從0-255)。
3)減去圖像(值從-255到255) - >使用cvSub()重新縮放的問題。
4)通過用0.5相乘並加入128
重新縮放我想從8位改變灰度圖像,以16位的,但隨後的一切變得更糟,併成爲許多行代碼和它到底沒有解決。
我想要減去兩個圖像。我的問題是cvSub()函數飽和。我想要做的是:通過使用opencv減去圖像
1)將原始圖像轉換爲灰度。
2)取灰度圖像(值從0-255)。
3)減去圖像(值從-255到255) - >使用cvSub()重新縮放的問題。
4)通過用0.5相乘並加入128
重新縮放我想從8位改變灰度圖像,以16位的,但隨後的一切變得更糟,併成爲許多行代碼和它到底沒有解決。
使用的OpenCV你可以執行以下操作:
這樣,不需要範圍轉換,結果可以完全縮放到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 =
感謝您的簡單解決方案!它解決了! - 好主意先做縮放,然後減去圖片。 – supergranu 2010-09-08 12:07:24
唯一的問題是一個人丟失了信息。在這種情況下,最好選擇Alexander Rafferty的版本。 – supergranu 2010-09-09 06:59:02
你能告訴我你在哪裏認爲,你信息鬆動嗎?你的意思是精確嗎? – 2010-09-09 07:01:10
您需要將8bit轉換爲16bit。 然後將255添加到第一張圖像,然後從中減去第二張圖像。 然後除以2並轉換回8位。
告訴我這是怎麼回事,它應該工作。
醜陋的解決方案只是循環顯示圖像,並且每個像素自己做一次。這基本上只是用C++翻譯你的問題(甚至應該更短)。 – mb14 2010-09-07 08:55:43