#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;class Level {public:int   Shadow;  //输入色阶黑点值float Midtones; //输入色阶灰点值(注意是浮点数)int   Highlight; //输入色阶白点值int   OutputShadow; //输出色阶黑点值int   OutputHighlight; //输出色阶白点值Level() {};virtual ~Level() {};bool createColorTable(uchar* colorTable){int diff = (int)(Highlight - Shadow);int outDiff = (int)(OutputHighlight - OutputShadow);if (!((Highlight <= 255 && diff <= 255 && diff >= 2) ||(OutputShadow <= 255 && OutputHighlight <= 255 && outDiff < 255) ||(!(Midtones > 9.99 && Midtones > 0.1) && Midtones != 1.0)))return false;double coef = 255.0 / diff;double outCoef = outDiff / 255.0;double exponent = 1.0 / Midtones;for (int i = 0; i < 256; i++){int v;// calculate black field and white field of input levelif (colorTable[i] <= (uchar)Shadow) {v = 0;}else {v = (int)((colorTable[i] - Shadow) * coef + 0.5);if (v > 255) v = 255;}// calculate midtone field of input levelv = (int)(pow(v / 255.0, exponent) * 255.0 + 0.5);// calculate output levelcolorTable[i] = (uchar)(v * outCoef + OutputShadow + 0.5);}return true;}};class Levels {protected:bool createColorTables(uchar colorTables[][256]){bool result = false;int i, j;//initialize color tablefor (i = 0; i < 3; i++) {for (j = 0; j < 256; j++)colorTables[i][j] = (uchar)j;}//create color table for each channel//result = BlueChannel.createColorTable(colorTables[0]);//result = GreenChannel.createColorTable(colorTables[1]);//result = RedChannel.createColorTable(colorTables[2]);result = RGBChannel.createColorTable(colorTables[0]);result = RGBChannel.createColorTable(colorTables[1]);result = RGBChannel.createColorTable(colorTables[2]);return result;}public:Level RGBChannel;  //RGB整体调整//Level RedChannel;  //红色通道//Level GreenChannel; //绿色通道//Level BlueChannel; //蓝色通道Levels() {};virtual ~Levels() {};//实施色阶调整int adjust(InputArray src, OutputArray dst) {Mat input = src.getMat();if (input.empty()) {return -1;}dst.create(src.size(), src.type());Mat output = dst.getMat();const uchar* in;uchar* out;int width = input.cols;int height = input.rows;int channels = input.channels();uchar colorTables[3][256];//create color tablesif (!createColorTables(colorTables)) {//error create color table"return 1;}//adjust each pixel
#ifdef HAVE_OPENMP
#pragma omp parallel for
#endiffor (int y = 0; y < height; y++) {in = input.ptr<uchar>(y);out = output.ptr<uchar>(y);for (int x = 0; x < width; x++) {for (int c = 0; c < 3; c++) {*out++ = colorTables[c][*in++];}for (int c = 0; c < channels - 3; c++) {*out++ = *in++;}}}return 0;}};void colorClassAdjust(Mat img, Mat& dst, int shadow = 202, int midtones = 100, int highlight = 255);int main()
{Mat src;//src = imread("E:\\photo\\xuxian.jpg");/*if (!src.data){std::cout << "error read image" << std::endl;return -1;}*/VideoCapture capture("G:\\shared\\CarShowRecorder1\\RecordVideo3\\CARSHOW_VID_20210830_145444.mp4");              //改用自己的视频地址if (!capture.isOpened()){std::cout << "no pic..." << std::endl;return -1;}namedWindow("src", 1);//Levels levels;//Level* currentChannel = NULL;//currentChannel = &levels.RGBChannel;//if (currentChannel == NULL)//    return -1;//// 给色阶的黑点、白点、灰度赋值//int   Shadow = 210;//int   Midtones = 100;//int   Highlight = 255;//int   OutputShadow = 0;//int   OutputHighlight = 255;//currentChannel->Shadow = Shadow;//currentChannel->Midtones = Midtones / 100.0;//currentChannel->Highlight = Highlight;//currentChannel->OutputShadow = OutputShadow;//currentChannel->OutputHighlight = OutputHighlight;for (;;){capture.read(src);imshow("src", src);Mat dst;//levels.adjust(src, dst);colorClassAdjust(src, dst);imshow("dst", dst);if (waitKey(30) > 0)break;}waitKey(0);return 0;
}void colorClassAdjust(Mat img, Mat& dst, int shadow, int midtones, int highlight)
{Levels levels;Level* currentChannel = NULL;currentChannel = &levels.RGBChannel;if (currentChannel == NULL)return ;// 给色阶的黑点、白点、灰度赋值//int   Shadow = 210;//int   Midtones = 100;//int   Highlight = 255;//int   OutputShadow = 0;//int   OutputHighlight = 255;currentChannel->Shadow = shadow;currentChannel->Midtones = midtones / 100.0;currentChannel->Highlight = highlight;currentChannel->OutputShadow = 0;currentChannel->OutputHighlight = 255;levels.adjust(img, dst);}

作用是为了提高每帧图片的对比度,需要注意的是:我已经将整个功能封装到 colorClassAdjust()方法中, 直接调用这个方法就可以, 另外,可以自行修改需要输出的OutputShadow(输出黑点)、OutputHighlight(输出高光)值
具体参数功能作用,代码注释有,如有问题,欢迎留言交流。

opencv 实线PS色阶调整相关推荐

  1. python实现简单的ps色阶调整过程

    最近在做一个用unet神经网络识别种子出苗率的项目(种子贼小,分辨率还贼低),由于识别的效果不太好,只能对图像做预处理了...预处理选用的是ps中的色阶处理,可是cv2等图像库中没有现成的函数,只能自 ...

  2. PS 色阶调整之算法公式原理详解及 Python 实现(色阶原理)

    本文介绍了 PS 中色阶的实现原理及公式,并用 Python 实现,自测与 PS 的色阶调整效果基本完全一样(使用和 PS 中色阶相同的参数对比效果,包括各极限值,本文只实现了 RGB 整体色阶的处理 ...

  3. python 实现ps色阶算法

    最近做一个分析图片色块的脚本,使用了opencv的自动色阶,感觉非常难用,针对不同图片得出的结果差强人意,然后发现ps手动调整色阶输出非常稳定,然后根据这两篇文章就有了这个函数. 本文章>> ...

  4. ps色阶怎么用:一招搞定曝光调整 | 萧蕊冰

    今天我们的小教程是有关ps色阶的,大家知道ps色阶怎么用吗?是否有在PS当中使用到呢,今天就跟着萧蕊冰一起来学习一些色阶小知识,色阶的用处呢,主要是可以搞定照片的对比度.黑场.白场.整体亮度等等曝光调 ...

  5. 【OpenCV 例程300篇】206. Photoshop 色阶调整算法

    OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 ...

  6. 用OpenCV实现Photoshop算法(四): 色阶调整

    系列文章: 用OpenCV实现Photoshop算法(一): 图像旋转 用OpenCV实现Photoshop算法(二): 图像剪切 用OpenCV实现Photoshop算法(三): 曲线调整 用Ope ...

  7. OpenCV—python 色阶调整(直方图均衡化 图像去雾)

    文章目录 一.色阶调整( Levels Adjustment )原理 二.自动色阶图像处理算法 一.色阶调整( Levels Adjustment )原理 色阶:就是用直方图描述出的整张图片的明暗信息 ...

  8. ps对比度调整的三种方法:ps自动对比度、色阶和曲线调整

    容提要:文章详细介绍ps对比度的调整方法,并给出一幅缺乏对比度的问题图像来介绍.ps对比度调整包括使用ps自动对比度.色阶.曲线命令调整的原理和方法. 对比度是指一幅图像中,明暗区域中最亮的白色和最暗 ...

  9. PS-第十二天-PS色阶的使用原理浅谈

    PS色阶的使用原理浅谈 色阶是什么:色阶就是用直方图描述出的整张图片的明暗信息. 样图 如图,从左至右是从暗到亮的像素分布,黑色三角代表最暗地方(纯黑),白色三角代表最亮地方(纯白).灰色三角代表中间 ...

最新文章

  1. python逐行读取文本
  2. 官方翻译不当导致的PowerShell运行失败一例
  3. 使用element ui 组件的时候,如果使用两个或多个按钮在同一个单元格内,按钮会竖着排列,但是不能够对齐怎么解决?
  4. 树分治树链剖分相关题目讨论
  5. 数据库的同步和复制----sql语句方法
  6. SAP CAM - Cloud Access Manager
  7. struts2学习笔记(常见错误)
  8. WebSocket实战之————GatewayWorker使用笔记例子
  9. 可缺一台洗衣机的ykcchf
  10. Jmeter安装设置
  11. 2016CCPC东北地区大学生程序设计竞赛题解
  12. Leetcode142. Linked List Cycle II环形链表2
  13. PHP 验证日期格式
  14. PCI/PCIe硬件相关知识
  15. python画反比例函数_拟合一个反比例函数
  16. Infor宣布首次公开募股
  17. LVGL v8学习笔记 | 06 - label控件的使用方法
  18. 有道云笔记怎样与微信连接服务器,有道云笔记打通微信接口 文章永久保存多终端查看...
  19. php获取哔哩哔哩追番_自己拥有一台服务器可以做哪些很酷的事情?
  20. 华环光端机MySQL_华环155M光端机 H9MO-LME-01T1642/EJ

热门文章

  1. Python+OpenCV实时图像处理
  2. IIS“服务没有及时响应启动或控制请求”错误解决
  3. VisualFreeBasic链接mysql数据库用法
  4. Luogu4745/Gym101620G CERC2017 Gambling Guide 期望、DP、最短路
  5. Java获得腾讯QQ在线状态(.net webservice)
  6. 星际官方小说《刀锋女王》——第4章(续)
  7. Dos下怎么返回上一级目录(DOS命令大全)
  8. 【健康知识】46个不可不知的生活小常识 !!!
  9. 大学生礼仪青花瓷旗袍 个个显得靓丽
  10. python 京东签到在哪里_京东签到在哪里?有哪些步骤呢?