數字影象處理中,其資料型別一般為無符號型別,實際計算過程中會經常出現資料溢位現象,在無符號資料中如果其值出現小於0 則稱之為向下溢位underflow,當計算結果大於其該資料型別能表示的最大值時稱之為overflow時,比如 當為符號8位乙個位元組時,如果計算結果出現小於0 則稱為underfow,計算結果大於0,稱為overflow.
在實際的c/c++語言中,對於無符號型別,其出現反轉時,將會按照迴圈處理反轉重新計數。
比如乙個 uchar型別 設vxy 為10 則表示式((10 - 128) * 2 + 128) 中(10 - 128)會被重新認為是有符號,最終結果為-108,如果將其結果重新賦值給uchar將會發生反轉,從0開始反轉重新計算其結果為(-108+256)=148.
如果vxy+255重新反轉計算結果還是10.
uchar vxy = 10;
uchar result = ((10 - 128) * 2 + 128);
char result3 = (vxy + 256);
printf("result: %d\n", result);
printf("result2: %d\n", result2);
printf("result3: %d\n", result3);
結果為:
result: 148
result3: 10
上述場景在opencv中稱之為saturation casting,在影象演算法結果中數值的結果溢位造成反轉會對實際結果造成影響,比如會造成影象過亮影響實際計算結果。
opencv支援cv::saturate_cast<>(),來解決資料溢位問題,當資料出現underflow時,其結果不反轉直接取該資料型別支援的最小值,當資料出現overflow時,結果直接去該資料型別最大值,比如:
uchar vxy = 10;
uchar result2 = cv::saturate_cast((vxy - 128) * 2 + 128);
uchar result4 = cv::saturate_cast((vxy + 256));
printf("result2: %d\n", result2);
printf("result4: %d\n", result4);
結果:
result2: 0
result4: 255
saturate_cast在演算法中都非常有用,比如改變影象的亮度和對比度,其公式如下:
當a和b過大時很容易造成其計算結果溢位,造成影象過亮:
用例,使用lena影象,通過調整對比度和亮度:
#include #include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
int g_ncontrastvalue;
int g_nbrightvalue;
mat g_srcimage, g_dstimage;
static void on_contrastandbright(int, void*)
} }imshow("【原始影象視窗】", g_srcimage);
imshow("【效果圖視窗】", g_dstimage);
}void main()
}
原圖為:
預設對比度和亮度都是80,其效果圖:
對比度為163和亮度為138時,可以看到很多部分都已經變白,其實很多資料有已經溢位,其值變為了255,達到了最亮
不使用 saturate_cast功能對資料溢位進行擷取時,其用例為:
#include #include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
int g_ncontrastvalue;
int g_nbrightvalue;
mat g_srcimage, g_dstimage;
static void on_contrastandbright(int, void*)
} }imshow("【原始影象視窗】", g_srcimage);
imshow("【效果圖視窗】", g_dstimage);
}void main()
}
對比度為123和亮度為80時,其資料已經出現溢位,此時圖形已經不對:
可以看到使用cv::saturate_cast<>()對資料進行擷取,可以有效防止資料溢位造成影象顯示失真問題
使用checked語句防止資料溢位
在c 中有乙個關鍵字checked,它用來判斷當前上下文中的數值運算和數值轉換是否會溢位。如是是常量溢位,那在編譯時就能發現 如果是變數溢位,那在執行時會丟擲overflowexception。數值運算有 unary 有了這個就不用擔心資料溢位了。checked checked 有兩種使用方法 1....
mysql防止記憶體溢位 mysql記憶體溢位處理
主庫實列發生oom,例項程序由於占用記憶體達到linux系統的最大閾值,導致linux系統kill了mysql例項程序,可以通過如下方式檢視mysql使用了多少記憶體 檢視每個執行緒占用多少記憶體,然後乘以正在執行的執行緒 也就是排查sleep的 select read buffer size re...
c 美味 使用checked語句防止資料溢位
在c 中有乙個關鍵字checked,它用來判斷當前上下文中的數值運算和數值轉換是否會溢位。如是是常量溢位,那在編譯時就能發現 如果是變數溢位,那在執行時會丟擲overflowexception。數值運算有 unary 有了這個就不用擔心資料溢位了。checked 有兩種使用方法 1.作為操作符來使用...