作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

图像饱和度是指图像色彩的纯洁性,色彩的鲜艳程度,它是影响色彩最终效果的重要属性之一。饱和度也被称为图片色彩纯度,即色彩中彩色成分和消色成分的占比,这个比例决定了色彩的饱和度及鲜艳程度。当色彩中彩色成分多时,其色彩就呈现饱和(色觉强)、鲜明效果,给人的视觉印象会更强烈;反之,若消色成分多,色彩会显得暗淡,视觉效果也随之减弱。

饱和度调整算法的实现流程如下:

1.设置调整参数percent,取值为-100到100,类似PS中设置,归一化后为-1到1。

2.针对图像所有像素点单个处理。计算RGB三通道的最大值最小值,可进一步得到delta和value:

3.若最大最小一致,即delta=0,则表明为灰点,不需继续操作,直接处理下个像素。

4.通过value计算出HSL中的L值:

5.S值为:

6.当percent大于等于0时,即提高色彩饱和度,那么alpha值为:

此时,调整后的图像RGB三通道值为:

7.若percent小于0时,即降低色彩饱和度,则alpha=percent,此时调整后的图像RGB三通道值为:

至此,图像实现了饱和度的调整,算法逻辑参考xingyanxiao。C++实现代码如下。

功能函数代码

// 饱和度
cv::Mat Saturation(cv::Mat src, int percent)
{float Increment = percent* 1.0f / 100;cv::Mat temp = src.clone();int row = src.rows;int col = src.cols;for (int i = 0; i < row; ++i){uchar *t = temp.ptr<uchar>(i);uchar *s = src.ptr<uchar>(i);for (int j = 0; j < col; ++j){uchar b = s[3 * j];uchar g = s[3 * j + 1];uchar r = s[3 * j + 2];float max = max3(r, g, b);float min = min3(r, g, b);float delta, value;float L, S, alpha;delta = (max - min) / 255;if (delta == 0)continue;value = (max + min) / 255;L = value / 2;if (L < 0.5)S = delta / value;elseS = delta / (2 - value);if (Increment >= 0){if ((Increment + S) >= 1)alpha = S;elsealpha = 1 - Increment;alpha = 1 / alpha - 1;t[3 * j + 2] =static_cast<uchar>( r + (r - L * 255) * alpha);t[3 * j + 1] = static_cast<uchar>(g + (g - L * 255) * alpha);t[3 * j] = static_cast<uchar>(b + (b - L * 255) * alpha);}else{alpha = Increment;t[3 * j + 2] = static_cast<uchar>(L * 255 + (r - L * 255) * (1 + alpha));t[3 * j + 1] = static_cast<uchar>(L * 255 + (g - L * 255) * (1 + alpha));t[3 * j] = static_cast<uchar>(L * 255 + (b - L * 255) * (1 + alpha));}}}return temp;
}

C++测试代码

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;#define max2(a,b) (a>b?a:b)
#define max3(a,b,c) (a>b?max2(a,c):max2(b,c))
#define min2(a,b) (a<b?a:b)
#define min3(a,b,c) (a<b?min2(a,c):min2(b,c))cv::Mat Saturation(cv::Mat src, int value);int main()
{cv::Mat src = imread("House.jpg");cv::Mat result = Saturation(src, 100);imshow("original", src);imshow("result", result);waitKey(0);return 0;
}// 饱和度
cv::Mat Saturation(cv::Mat src, int percent)
{float Increment = percent* 1.0f / 100;cv::Mat temp = src.clone();int row = src.rows;int col = src.cols;for (int i = 0; i < row; ++i){uchar *t = temp.ptr<uchar>(i);uchar *s = src.ptr<uchar>(i);for (int j = 0; j < col; ++j){uchar b = s[3 * j];uchar g = s[3 * j + 1];uchar r = s[3 * j + 2];float max = max3(r, g, b);float min = min3(r, g, b);float delta, value;float L, S, alpha;delta = (max - min) / 255;if (delta == 0)continue;value = (max + min) / 255;L = value / 2;if (L < 0.5)S = delta / value;elseS = delta / (2 - value);if (Increment >= 0){if ((Increment + S) >= 1)alpha = S;elsealpha = 1 - Increment;alpha = 1 / alpha - 1;t[3 * j + 2] =static_cast<uchar>( r + (r - L * 255) * alpha);t[3 * j + 1] = static_cast<uchar>(g + (g - L * 255) * alpha);t[3 * j] = static_cast<uchar>(b + (b - L * 255) * alpha);}else{alpha = Increment;t[3 * j + 2] = static_cast<uchar>(L * 255 + (r - L * 255) * (1 + alpha));t[3 * j + 1] = static_cast<uchar>(L * 255 + (g - L * 255) * (1 + alpha));t[3 * j] = static_cast<uchar>(L * 255 + (b - L * 255) * (1 + alpha));}}}return temp;
}

测试效果

图1 原图

图2 percent为50时的效果图

图3 percent为-50时的效果图

通过调整percent可以实现图像饱和度的调整。

如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-图像饱和度相关推荐

  1. 2、OpenCV图像的读写操作

    OpenCV图像的读写操作 概要 图像由像素组成. 像素可以被认为是非常小的正方形结构,当连接在一起时会生成图像. 它们是任何图像的最小组成部分. 如果您仔细查看前面的图像,您将能够在图像中看到一些正 ...

  2. OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度(Sobel和Scharr) 1 图像梯度是什么? 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2.Sobel计算Sobel渐 ...

  3. Python,OpenCV图像金字塔cv2.pyrUp(), cv2.pyrDown()

    Python,OpenCV图像金字塔cv2.pyrUp, cv2.pyrDown 1. 效果图 2. 原理 2.1 什么是图像金字塔 2.2 金字塔分类 2.3 应用 3. 源码 参考 这篇博客将介绍 ...

  4. OpenCV图像缩放插值之BiCubic双三次插值

    图像缩放算法简介 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中 ...

  5. python皮同_Python OpenCV 图像的双线性插值算法,全网最细致的算法说明_橡皮擦,一个逗趣的互联网高级网虫-CSDN博客...

    原文作者:梦想橡皮擦 原文标题:Python OpenCV 图像的双线性插值算法,全网最细致的算法说明 发布时间:2021-02-17 20:55:32 Python OpenCV 365 天学习计划 ...

  6. OpenCV 图像加载和显示

    OpenCV 图像加载和显示 OpenCV 图像加载和显示 加载图像(使用cv :: imread) 创建一个名为OpenCV的窗口(使用cv :: namedWindow) 在OpenCV窗口中显示 ...

  7. OpenCV图像坐标系与行列宽高的关系

    这篇文章挺好    OpenCV图像坐标系与行列宽高的关系 图片坐标系,与从小到大见到的xy坐标系,x轴方向相同,只是y轴方向相反.

  8. python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)

    python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录

  9. python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)

    python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录

  10. python opencv 图像膨胀

    python opencv 图像膨胀 代码: import cv2 import numpy as np # 图像膨胀 def dilate_img(img,a,iterations):kernel ...

最新文章

  1. epoll ET模式服务器和客户端源码例子
  2. Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(三)
  3. 成都计算机安全学会怎么样,成都计算机专科大学
  4. JavaSE(十五)——注解
  5. 《Cracking the Coding Interview》——第18章:难题——题目3
  6. ArcGis中空间连接join
  7. 对象创建过程之二(类加载器)
  8. 快速指南:剖析JBoss BPM跨进程通信
  9. C# 向Com口发送数据
  10. opencv基础--图像模板匹配
  11. 我不应该用计算机做题,超级计算器:能帮你做题的计算器,就是它了
  12. 【docker】docker学习
  13. 去除word PDF水印 去除pdf限制
  14. PG 数据库表备份方案
  15. linux usb有线网卡驱动_linux系统下安装usb网卡驱动图文?
  16. 基于高德地图实现Marker聚合效果
  17. 暴走英雄坛服务器维护,《暴走英雄坛》4月29日更新公告
  18. Jekyll 教程——合集(collections)
  19. [PowerBI]DAX虚拟连接函数:TREATAS()用法介绍
  20. STM32控制HC-05蓝牙模块进行通信

热门文章

  1. 《Cisco防火墙》一8.7 通过NAT规则定义连接限制
  2. FastDFS之文件服务器集群部署详解
  3. delphi listbox 使用
  4. 分布式红锁的leaseTime的设计原理
  5. 第3章 系统设计和架构设计【扩胸运动,有容乃大】
  6. 2-11 支付宝集福卡_实现分析
  7. python 构造函数_Python和其他编程语言的代码对比
  8. 用mysql完成的实际案例_mysql完成SQL统计的案例
  9. python离散积分_科学网—python数据处理笔记(三)通道积分图 - 钱磊的博文
  10. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾