首页 > 其他分享 >OpenCV(图像饱和度)

OpenCV(图像饱和度)

时间:2024-09-22 12:51:19浏览次数:8  
标签:Mat OpenCV RGB HSV 图像 饱和度 cv

目录



1. 图像饱和度

饱和度(Saturation)指的是颜色的纯度或浓度,决定了颜色的鲜艳程度。高饱和度的颜色看起来更加鲜艳,而低饱和度的颜色则显得灰暗或淡化。饱和度主要与色彩空间中的色调(Hue)和亮度(Lightness/Brightness)相区分。

在处理图像时,常见的色彩空间包括:

  • RGB:通过红色 (Red)、绿色 (Green) 和蓝色 (Blue) 这三种原色组合形成其他颜色。
  • HSV(Hue, Saturation, Value):色调、饱和度和亮度。这个色彩空间更加接近人类的感知方式,饱和度在这里作为一个独立的维度。


2. 调整饱和度的基本原理

为了调整图像的饱和度,通常我们会将图像从 RGB 色彩空间转换到 HSV 色彩空间,因为在 HSV 中,饱和度(S)是一个独立的维度。我们可以只修改饱和度而不影响色调和亮度,然后将图像转换回 RGB 色彩空间。



3. 示例

3.1 对 RGB 图像进行饱和度的调整。

#include <opencv2/opencv.hpp>
#include <iostream>

// 调整饱和度的函数
void adjustSaturation(cv::Mat& src, cv::Mat& dst, double saturationScale) {
    // 将RGB图像转换为HSV色彩空间
    cv::Mat hsv;
    cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV);

    // 遍历图像,调整饱和度
    for (int i = 0; i < hsv.rows; ++i) {
        for (int j = 0; j < hsv.cols; ++j) {
            // 获取每个像素的HSV值
            cv::Vec3b& pixel = hsv.at<cv::Vec3b>(i, j);
            
            // 读取饱和度(S),它在0到255之间
            int saturation = pixel[1];
            
            // 根据给定的缩放因子调整饱和度
            saturation = cv::saturate_cast<uchar>(saturation * saturationScale);
            
            // 将新的饱和度值赋给像素
            pixel[1] = saturation;
        }
    }

    // 将HSV图像转换回RGB色彩空间
    cv::cvtColor(hsv, dst, cv::COLOR_HSV2BGR);
}

int main() {
    // 读取原始图像
    cv::Mat src = cv::imread("input.jpg");
    if (src.empty()) {
        std::cerr << "Error: Could not open image file." << std::endl;
        return -1;
    }

    // 输出图像
    cv::Mat dst;

    // 调整饱和度,缩放因子为1.5,意味着增加50%的饱和度
    double saturationScale = 1.5;
    adjustSaturation(src, dst, saturationScale);

    // 显示结果
    cv::imshow("Original Image", src);
    cv::imshow("Saturation Adjusted Image", dst);

    // 等待按键退出
    cv::waitKey(0);
    return 0;
}

代码说明:

  1. 输入和输出图像:通过 cv::imread() 函数读取输入图像,并通过 cv::imwrite() 保存处理后的图像。

  2. 色彩空间转换:使用 cv::cvtColor() 函数将 RGB 图像转换为 HSV 色彩空间,方便操作饱和度。

  3. 饱和度调整:在 HSV 色彩空间中,遍历每个像素并调整其饱和度(第二个通道值)。为了避免超出范围,使用 cv::saturate_cast<uchar>() 来保证饱和度值在 0 到 255 之间。

  4. 转换回 RGB:处理完成后,使用 cv::cvtColor() 将图像从 HSV 色彩空间转换回 RGB 并进行显示和保存。


3.2 对 RGB 图像进行饱和度的调整。

#include <opencv2/opencv.hpp>
#include <iostream>

// 调整饱和度函数
cv::Mat adjustSaturation(const cv::Mat& inputImage, double scale) {
    // 将输入图像转换为HSV颜色空间
    cv::Mat hsvImage;
    cv::cvtColor(inputImage, hsvImage, cv::COLOR_BGR2HSV);

    // 分离HSV通道
    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    // 调整饱和度 (S 通道)
    hsvChannels[1].convertTo(hsvChannels[1], -1, scale, 0);

    // 合并通道
    cv::merge(hsvChannels, hsvImage);

    // 将HSV图像转换回BGR颜色空间
    cv::Mat outputImage;
    cv::cvtColor(hsvImage, outputImage, cv::COLOR_HSV2BGR);

    return outputImage;
}

int main() {
    // 读取图像
    cv::Mat inputImage = cv::imread("input.jpg");
    if (inputImage.empty()) {
        std::cerr << "无法读取图像!" << std::endl;
        return -1;
    }

    // 调整饱和度,scale > 1 增加饱和度,scale < 1 减少饱和度
    double saturationScale = 1.5;  // 增加50%的饱和度
    cv::Mat adjustedImage = adjustSaturation(inputImage, saturationScale);

    // 显示结果
    cv::imshow("Original Image", inputImage);
    cv::imshow("Saturation Adjusted Image", adjustedImage);

    // 保存结果
    cv::imwrite("adjusted_image.jpg", adjustedImage);

    cv::waitKey(0);
    return 0;
}

代码说明:

  1. cvtColor(inputImage, hsvImage, cv::COLOR_BGR2HSV): 将输入图像从BGR转换到HSV颜色空间。

  2. split(hsvImage, hsvChannels): 将HSV图像分割为3个通道(H、S、V)。

  3. hsvChannels[1].convertTo(hsvChannels[1], -1, scale, 0): 对S通道应用比例缩放来调整饱和度。

  4. merge(hsvChannels, hsvImage): 合并调整后的HSV通道。

  5. cvtColor(hsvImage, outputImage, cv::COLOR_HSV2BGR): 将调整后的HSV图像转换回BGR颜色空间。



4. 调整饱和度的影响

  • 增大饱和度:提高饱和度可以使颜色更加鲜艳和浓烈。
  • 减小饱和度:降低饱和度则会使图像的颜色趋向灰色,最终饱和度为 0 时,图像变为灰度图像。

你可以通过 saturationScale 参数来控制饱和度的增加或减少,值大于 1 增加饱和度,值小于 1 减少饱和度。



标签:Mat,OpenCV,RGB,HSV,图像,饱和度,cv
From: https://www.cnblogs.com/keye/p/18425175

相关文章

  • 数字图像面积计算一般方法及MATLAB实现
    一、引言     在数字图像处理中,经常需要获取感兴趣区域的面积属性,下面给出图像处理的一般步骤。1.读入的彩色图像 2.将彩色图像转化为灰度图像  3.灰度图像转化为二值图像 4.区域标记5.对每个区域的面积进行计算和显示二、程序代码%面积计算clearall; %......
  • OpenCV(cv::saturate_cast())
    目录1.函数定义2.为什么需要saturate_cast()?3.工作原理4.示例代码:4.1将浮点数转换为uchar4.2将负数转换为uchar4.3普通类型转换5.主要优点总结cv::saturate_cast()是OpenCV中一个非常重要的函数,它用于将一个值强制转换为指定类型,并确保值不会超出取值范围。它主......
  • 如何使用 HTML 和 CSS 使图像在悬停时旋转
    图像上的悬停旋转效果可以使您的内容更具吸引力和互动性。在本教程中,我们将引导您了解如何仅使用html和css创建简单但引人注目的悬停旋转效果。如何创造效果html:首先,添加以下html代码:<figureclass="hover-rotate">@@##@@</figure>登录后复制您可以添加任何......
  • OPENCV入门总结
        在近期对计算机视觉的学习中,有一些心得与感受和大家一起分享,并且也说一些我做题目用到的函数和一些常见错误TEST1:图像边框对矩形的轮廓识别与绘制,难点在于利用色彩来选中红色图形与绿色图形进行处理(后面的几个题也是利用了相同的方法对图像进行特定操作)我们在......
  • 第152期 利用光谱和图像数据,揭开苹果叶片病虫害之谜(目标检测)
    亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。一、引言苹果作为全球广泛种植的水果之一,在中国拥有庞大的种植面积和总产量。然而,随着......
  • 第154期 智能手机图像去噪数据集的创新构建与实践运用(目标检测)
    亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。一、引言随着智能手机摄影技术的飞速发展,其成像质量已经逐渐接近甚至在某些场景下超越......
  • 第155期 中药材图像识别:中医与深度学习的融合(目标检测)
    亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。一、引言中医药作为中华文明的瑰宝,历经千年传承,依然在现代医学中发挥着不可替代的作用......
  • 基于python的opencv图像处理基本操作
    一、如何下载opencv包在Python中下载OpenCV包,最常用的方法是使用pip命令。pip是Python的包安装工具,可以方便地从Python包索引(PyPI)安装和管理包。以下是一些基本的步骤和命令,帮助你通过pip安装OpenCV。在命令行中输入以下命令来安装OpenCV:pipinstallopencv-python在国内使......
  • 基于OpenCV的单目测距
    随着计算机视觉技术的发展,单目测距作为一种重要的视觉测量手段,在众多领域得到了广泛的应用。本文将探讨基于OpenCV的单目测距原理、局限性、实际应用场景以及一些优化方案。单目测距的原理单目测距是指利用一台摄像机拍摄到的单一图像来进行距离测量的技术。与双目测距相比,......
  • OpenCV(cv::bitwise_not())
    目录1.函数定义2.工作原理3.示例cv::bitwise_not()是OpenCV中用于对图像或矩阵进行按位取反操作的函数。它将输入图像的每个像素的值进行按位反转,生成输出图像。按位取反是对每个位进行反转,即将二进制数中的0变为1,1变为0。1.函数定义voidcv::bitwise_not(Inpu......