当前位置: 首页 > news >正文

图像亮度和对比度的调整

在网上找了很多图像亮度的调整算法,下面是其中一种,可以通过条形框进行调整,并实时的查看对应参数值后的效果。

图像亮度处理公式:
y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);

x 是输入像素值
y 是输出像素值
B 是亮度值, 范围在[-1,1]之间

对比度处理公式:
k是调节对比度
k = tan( (45 + 44 * c) / 180 * PI );
c 是对比度值, 范围在[-1,1]之间

下面是具体实现代码

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"using namespace std;
using namespace cv;#define SWAP(a, b, t)  do { t = a; a = b; b = t; } while(0)
#define CLIP_RANGE(value, min, max)  ( (value) > (max) ? (max) : (((value) < (min)) ? (min) : (value)) )
#define COLOR_RANGE(value)  CLIP_RANGE(value, 0, 255)
#define M_PI 3.1415926
int adjustBrightnessContrast(InputArray src, OutputArray dst, int brightness, int contrast)
{Mat input = src.getMat();if (input.empty()) {return -1;}dst.create(src.size(), src.type());Mat output = dst.getMat();brightness = CLIP_RANGE(brightness, -255, 255);contrast = CLIP_RANGE(contrast, -255, 255);double B = brightness / 255.;double c = contrast / 255.;double k = tan((45 + 44 * c) / 180 * M_PI);Mat lookupTable(1, 256, CV_8U);uchar* p = lookupTable.data;for (int i = 0; i < 256; i++)p[i] = COLOR_RANGE((i - 127.5 * (1 - B)) * k + 127.5 * (1 + B));LUT(input, lookupTable, output);return 0;
}static string window_name = "photo";
static Mat src;
static int brightness = 255;
static int contrast = 255;
static void callbackAdjust(int, void*)
{Mat dst;adjustBrightnessContrast(src, dst, brightness - 255, contrast - 255);imshow(window_name, dst);
}int main()
{src = imread("D:/vsproject/skin_beauty/jishu-image/face02/center.jpg");if (!src.data) {cout << "error read image" << endl;return -1;}namedWindow(window_name, WINDOW_NORMAL);resizeWindow(window_name, 800, 600);//设置窗口展示大小createTrackbar("brightness", window_name, &brightness, 2 * brightness, callbackAdjust);createTrackbar("contrast", window_name, &contrast, 2 * contrast, callbackAdjust);callbackAdjust(0, 0);waitKey();return 0;}

http://www.lryc.cn/news/384117.html

相关文章:

  • Linux加固-权限管理_chattr之i和a参数
  • windows10/win11截图快捷键 和 剪贴板历史记录 快捷键
  • 上海计算机考研避雷,25考研慎报
  • 第九次作业
  • A股探底回升,跑出惊天大阳,你们知道为什么吗?
  • jenkins nginx自动化部署 php项目
  • 海外代理IP哪个可靠?如何测试代理的稳定性?
  • MySQL之可扩展性(四)
  • JupyterLab使用指南(三):JupyterLab的Cell详细介绍
  • solidity智能合约如何实现跨合约调用函数
  • 关于Vue2的生命周期会问到哪些面试题?
  • 尚品汇-(七)
  • 【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间
  • keepalived 服务高可用(简约版)
  • 【前端】Vue项目和微信小程序生成二维码和条形码
  • 同时使用接口文档swagger和knife4j
  • Compose - 权限申请
  • 第十九条:要么为继承而设计并提供文档说明,要么就禁止继承
  • Node.js全栈指南:浏览器显示一个网页
  • Linux远程桌面(Ubuntu/Deepin)——安装和使用 VNC 及通过 noVNC 实现浏览器实现远程桌面访问教程
  • 2024年最新通信安全员考试题库
  • SpringMVC系列八: 手动实现SpringMVC底层机制-下
  • 【昇思初学入门】第八天打卡-模型保存与加载
  • 喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”
  • 深入探讨:UART与USART在单片机中串口的实际应用与实现技巧
  • Windows上PyTorch3D安装踩坑记录
  • 操作符详解(上) (C语言)
  • 使用 audit2allow 工具添加SELinux权限的方法
  • 一文弄懂FPGA
  • Rust 中使用 :: 这种语法的几种情况