OpenCV 图像对比度的实践

作者:翟天保Steven 时间:2023-07-29 09:09:27 

本文主要介绍了OpenCV 图像对比度,具有一定的参考价值,感兴趣的可以了解一下

实现原理

图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。差异范围越大代表对比越大,差异范围越小代表对比越小。设置一个基准值thresh,当percent大于0时,需要令图像中的颜色对比更强烈,即数值距离thresh越远,则变化越大;当percent等于1时,对比强到极致,只有255和0的区分;当percent等于0时,不变;当percent小于0时,对比下降,即令远离thresh的数值更近些;当percent等于-1时,没有对比了,全是thresh值。

对比度调整算法的实现流程如下:

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

2.针对图像所有像素点单个处理。当percent大于等于0时,对比增强,调整后的RGB三通道数值为:

OpenCV 图像对比度的实践

3.若percent小于0时,对比降低,此时调整后的图像RGB三通道值为:

OpenCV 图像对比度的实践

4.若percent等于1时,大于thresh则等于255,小于则等于0。

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

功能函数代码


// 对比度
cv::Mat Contrast(cv::Mat src, int percent)
{
float alpha = percent / 100.f;
alpha = max(-1.f, min(1.f, alpha));
cv::Mat temp = src.clone();
int row = src.rows;
int col = src.cols;
int thresh = 127;
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];
int newb, newg, newr;
if (alpha == 1)
{
t[3 * j + 2] = r > thresh ? 255 : 0;
t[3 * j + 1] = g > thresh ? 255 : 0;
t[3 * j] = b > thresh ? 255 : 0;
continue;
}
else if (alpha >= 0)
{
newr = static_cast<int>(thresh + (r - thresh) / (1 - alpha));
newg = static_cast<int>(thresh + (g - thresh) / (1 - alpha));
newb = static_cast<int>(thresh + (b - thresh) / (1 - alpha));
}
else {
newr = static_cast<int>(thresh + (r - thresh) * (1 + alpha));
newg = static_cast<int>(thresh + (g - thresh) * (1 + alpha));
newb = static_cast<int>(thresh + (b - thresh) * (1 + alpha));

}
newr = max(0, min(255, newr));
newg = max(0, min(255, newg));
newb = max(0, min(255, newb));
t[3 * j + 2] = static_cast<uchar>(newr);
t[3 * j + 1] = static_cast<uchar>(newg);
t[3 * j] = static_cast<uchar>(newb);
}
}
return temp;
}

C++测试代码


#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

cv::Mat Contrast(cv::Mat src, int percent);

int main()
{
cv::Mat src = imread("5.jpg");
cv::Mat result = Contrast(src, 50.f);
imshow("original", src);
imshow("result", result);
waitKey(0);
return 0;
}

// 对比度
cv::Mat Contrast(cv::Mat src, int percent)
{
float alpha = percent / 100.f;
alpha = max(-1.f, min(1.f, alpha));
cv::Mat temp = src.clone();
int row = src.rows;
int col = src.cols;
int thresh = 127;
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];
int newb, newg, newr;
if (alpha == 1)
{
t[3 * j + 2] = r > thresh ? 255 : 0;
t[3 * j + 1] = g > thresh ? 255 : 0;
t[3 * j] = b > thresh ? 255 : 0;
continue;
}
else if (alpha >= 0)
{
newr = static_cast<int>(thresh + (r - thresh) / (1 - alpha));
newg = static_cast<int>(thresh + (g - thresh) / (1 - alpha));
newb = static_cast<int>(thresh + (b - thresh) / (1 - alpha));
}
else {
newr = static_cast<int>(thresh + (r - thresh) * (1 + alpha));
newg = static_cast<int>(thresh + (g - thresh) * (1 + alpha));
newb = static_cast<int>(thresh + (b - thresh) * (1 + alpha));

}
newr = max(0, min(255, newr));
newg = max(0, min(255, newg));
newb = max(0, min(255, newb));
t[3 * j + 2] = static_cast<uchar>(newr);
t[3 * j + 1] = static_cast<uchar>(newg);
t[3 * j] = static_cast<uchar>(newb);
}
}
return temp;
}

测试效果

OpenCV 图像对比度的实践

图1 原图

OpenCV 图像对比度的实践 

图2 参数为50的效果图

OpenCV 图像对比度的实践

图3 参数为-50的效果图

通过调整percent可以实现图像对比度的调整。

来源:https://blog.csdn.net/zhaitianbao/article/details/120107171

标签:OpenCV,图像对比度
0
投稿

猜你喜欢

  • Python获取android设备cpu和内存占用情况

    2023-02-25 20:46:47
  • Python深度学习pyTorch权重衰减与L2范数正则化解析

    2021-03-18 11:39:01
  • sql server常用命令行操作(启动、停止、暂停)

    2012-01-05 19:02:48
  • Go语言Goroutinue和管道效率详解

    2024-02-02 18:19:09
  • SqlServer备份数据库的4种方式介绍

    2024-01-17 09:58:15
  • 基于Python+Turtle实现绘制简易的大风车

    2021-02-25 18:52:11
  • php获取文件大小的方法

    2024-05-13 09:26:15
  • 不到20行代码用Python做一个智能聊天机器人

    2021-07-21 08:43:40
  • python中的函数嵌套和嵌套调用

    2021-09-05 01:10:26
  • django解决跨域请求的问题详解

    2021-07-21 14:45:45
  • ASP状态封装类Cache、Cookie & Session

    2008-05-11 19:33:00
  • MYSQL教程:MYSQL字符集支持

    2009-02-27 15:55:00
  • python 使用fileinput读取文件

    2021-09-07 23:48:43
  • Python 实现键盘鼠标按键模拟

    2021-11-30 11:00:26
  • Django使用channels + websocket打造在线聊天室

    2022-01-05 11:16:26
  • 解析:正确的理解SQL Server和XML支持

    2009-01-23 13:52:00
  • Web端扫码登录的原理和实现讲解

    2022-07-08 11:40:18
  • Python OpenCV中的numpy与图像类型转换操作

    2023-11-17 09:24:20
  • 在golang中操作mysql数据库的实现代码

    2024-01-15 14:41:51
  • jenkins自动构建发布vue项目的方法步骤

    2024-04-30 10:47:14
  • asp之家 网络编程 m.aspxhome.com