图像饱和度是指色彩的鲜艳程度,它是影响色彩最终效果的重要属性之一。
饱和度也被称为图片色彩纯度,即色彩中彩色成分和消色成分的占比,这个比例决定了色彩的饱和度及鲜艳程度。当色彩中彩色成分多时,其色彩就呈现饱和(色觉强)。鲜明效果,给人的视觉印象会更强烈;反之,若消色成分多,色彩会显得暗淡,视觉效果也随之减弱。(书读百变其义自现)
调整饱和度的思想:
- 计算每个像素点关于RGB的最大值、最小值
- 设备用值:
- delta为两值(最大值、最小值)之差/255
- value为两值(最大值、最小值)之和/255
- 把RGB图像转换成HSL图像(Hue色彩,Saturability饱和度,Light亮度)
- Light亮度= value/2,如果Light亮度<0.5,饱和度=delta/value;否则饱和度=delta/(2-value)
- 最后根据增量判断做怎么样的处理,将转换后的新的TGB值存到新图片内
//饱和度:值(-1)<-->(+1)
//arg1为饱和度的值,正值提升饱和度,负值降低饱和度
void MainWindow::on_doubleSpinBox_2_valueChanged(double arg1)
{
//导入原始图片
Mat m_Mat = imread(m_FileName.toStdString());//通过图像路径导入原始文件
//定义新的Mat来存放调节饱和度后的图像信息(数据)
Mat temp=Mat::zeros(m_Mat.size(),m_Mat.type()) ;
//定义备用变量
float minVal,maxVal;//像素点的三基色的最大值,最小值
float delta;//(maxVal-minVal)/255.0;
float value;//(maxVal+minVal)/255.0;
float L,S,alpha;//RGB图像空间转化为HSL(H色调,S饱和度,L亮度)
//开始处理
for (int i = 0; i < m_Mat.rows; ++i) {
for (int j = 0; j < m_Mat.cols; ++j) {
//1.计算每个像素点关于RGB的最大值、最小值
uchar b = m_Mat.at<Vec3b>(i,j)[0];
uchar g = m_Mat.at<Vec3b>(i,j)[1];
uchar r = m_Mat.at<Vec3b>(i,j)[2];
maxVal = max3(r,g,b);
minVal = min3(r,g,b);
if(maxVal == minVal){continue;}//灰点不做处理
//2.delta为两值之差/255,value为两值之和/255
delta = (maxVal-minVal)/255.0;
value = (maxVal+minVal)/255.0;
//3.把RGB图像转换成HSL图像(Hue色彩,Saturability饱和度,Light亮度)
//HSL中的L(亮度)值
L=value/2;
//HSL中的S(饱和度)值
if(L<0.5){
S = delta/value;
}
else if(L>=0.5){
S=delta/(2-value);
}
//改变图像饱和度
if(arg1>=0){//提高饱和度
if(arg1+S>=1){
alpha = S;
}
else{
alpha = 1-arg1;
}
alpha = 1/alpha-1;
temp.at<Vec3b>(i,j)[0]=saturate_cast<uchar>(m_Mat.at<Vec3b>(i,j)[0]+(m_Mat.at<Vec3b>(i,j)[0]-L*255)*alpha);
temp.at<Vec3b>(i,j)[1]=saturate_cast<uchar>(m_Mat.at<Vec3b>(i,j)[1]+(m_Mat.at<Vec3b>(i,j)[1]-L*255)*alpha);
temp.at<Vec3b>(i,j)[2]=saturate_cast<uchar>(m_Mat.at<Vec3b>(i,j)[2]+(m_Mat.at<Vec3b>(i,j)[2]-L*255)*alpha);
}
else{//降低饱和度
alpha = arg1;
temp.at<Vec3b>(i,j)[0]=L*255.0+((m_Mat.at<Vec3b>(i,j)[0])-L*255.0)*(alpha+1);
temp.at<Vec3b>(i,j)[1]=L*255.0+((m_Mat.at<Vec3b>(i,j)[1])-L*255.0)*(alpha+1);
temp.at<Vec3b>(i,j)[2]=L*255.0+((m_Mat.at<Vec3b>(i,j)[2])-L*255.0)*(alpha+1);
}
}
}
//刷新图像
QImage img = cvMat_To_Qimage(temp);
img = img.scaled(ui->label_2->geometry().width(),ui->label_2->geometry().height(),
Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
ui->label_2->setPixmap(QPixmap::fromImage(img));
}