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);
}
}
}

總結:
相當於是對圖像色彩變化時做的保護!
