饱和度调整

图像饱和度是指色彩的鲜艳程度,它是影响色彩最终效果的重要属性之一。

饱和度也被称为图片色彩纯度,即色彩中彩色成分和消色成分的占比,这个比例决定了色彩的饱和度及鲜艳程度。当色彩中彩色成分多时,其色彩就呈现饱和(色觉强)。鲜明效果,给人的视觉印象会更强烈;反之,若消色成分多,色彩会显得暗淡,视觉效果也随之减弱。(书读百变其义自现)

调整饱和度的思想:

  1. 计算每个像素点关于RGB的最大值、最小值
  2. 设备用值:
  3.  delta为两值(最大值、最小值)之差/255
  4. value为两值(最大值、最小值)之和/255
  5. 把RGB图像转换成HSL图像(Hue色彩,Saturability饱和度,Light亮度)
  6. Light亮度= value/2,如果Light亮度<0.5,饱和度=delta/value;否则饱和度=delta/(2-value)
  7. 最后根据增量判断做怎么样的处理,将转换后的新的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));
}

 

Java中可以使用 BufferedImage 类和 ColorConvertOp 类来实现图像饱和度调整。下面是一个简单的示例代码: ```java import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.image.ColorConvertOp; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class SaturationAdjustment { public static void main(String[] args) throws IOException { // 读取图像文件 BufferedImage image = ImageIO.read(new File("input.jpg")); // 转换图像到 HSB 颜色空间 ColorConvertOp colorConvertOp = new ColorConvertOp(Color.RGBtoHSB(0, 0, 0, null), null); BufferedImage hsbImage = colorConvertOp.filter(image, null); // 调整图像饱和度 float saturationFactor = 1.5f; // 饱和度缩放因子 for (int y = 0; y < hsbImage.getHeight(); y++) { for (int x = 0; x < hsbImage.getWidth(); x++) { float[] hsb = Color.RGBtoHSB(hsbImage.getRGB(x, y) & 0xFF, (hsbImage.getRGB(x, y) >> 8) & 0xFF, (hsbImage.getRGB(x, y) >> 16) & 0xFF, null); hsb[1] *= saturationFactor; // 调整饱和度 int rgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]); hsbImage.setRGB(x, y, rgb); } } // 转换图像回 RGB 颜色空间 colorConvertOp = new ColorConvertOp(Color.HSBtoRGB(0, 0, 0, null), null); BufferedImage adjustedImage = colorConvertOp.filter(hsbImage, null); // 保存调整后的图像文件 ImageIO.write(adjustedImage, "jpg", new File("output.jpg")); } } ``` 在上面的代码中,我们首先使用 ImageIO 类的 read 方法读取图像文件,并使用 ColorConvertOp 类将图像转换到 HSB 颜色空间。然后,我们遍历图像的每个像素,调整饱和度,并将调整后的像素值设置回 HSB 图像。最后,我们再使用 ColorConvertOp 类将图像转换回 RGB 颜色空间,最终保存调整后的图像文件。你可以根据实际需要调整 saturationFactor 参数的值来实现不同程度的饱和度调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值