saturate_cast主要是為了防止顏色溢出操作。
在圖像處理方面,無論是加是減,乘除,都會超出一個像素灰度值的范圍(0~255),saturate_cast函數的作用即是:當運算完之后,結果為負,則轉為0,結果超出255,則為255。
原理大致如下 if(data<0) data=0; elseif(data>255) data=255;
比如我們對像素進行線性操作。
<1> 不使用saturate_cast<uchar>
//三個for循環,執行運算 g_dstImage(i,j) =a*g_srcImage(i,j) + b for (int y = 0; y < g_srcImage.rows; y++) { for (int x = 0; x < g_srcImage.cols; x++) { for (int c = 0; c < 3; c++) { //g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue); g_dstImage.at<Vec3b>(y, x)[c] = (g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue; } } }
<2> 使用saturate_cast<uchar>
//三個for循環,執行運算 g_dstImage(i,j) =a*g_srcImage(i,j) + b for (int y = 0; y < g_srcImage.rows; y++) { for (int x = 0; x < g_srcImage.cols; x++) { for (int c = 0; c < 3; c++) { g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue); } } }
總結:
相當於是對圖像色彩變化時做的保護!