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

[C++][opencv]基于opencv实现photoshop算法灰度化图像

测试环境】

vs2019

opencv==4.8.0

【效果演示】

【核心实现代码】

BlackWhite.hpp

#ifndef OPENCV2_PS_BLACKWHITE_HPP_
#define OPENCV2_PS_BLACKWHITE_HPP_#include "opencv2/core.hpp"namespace cv {class BlackWhite {
public:float 	red;     //红色的灰度系数值,取值范围: [-1.0, 1.0]float 	yellow;  //黄色的灰度系数值,取值范围: [-1.0, 1.0]float 	green;   //绿色的灰度系数值,取值范围: [-1.0, 1.0]float 	cyan;    //青色的灰度系数值,取值范围: [-1.0, 1.0]float 	blue;    //蓝色的灰度系数值,取值范围: [-1.0, 1.0]float 	magenta; //洋红色的灰度系数值,取值范围: [-1.0, 1.0]BlackWhite();virtual ~BlackWhite();int adjust(InputArray src, OutputArray dst);//实施黑白调整
};} /* namespace cv */#endif /* OPENCV2_PS_BLACKWHITE_HPP_ */

 BlackWhite.cpp

#include "BlackWhite.hpp"#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)//color index
typedef enum COLOR_INDEX {INDEX_RED,INDEX_YELLOW,INDEX_GREEN,INDEX_CYAN,INDEX_BLUE,INDEX_MAGENTA
} color_index_t;namespace cv {BlackWhite::BlackWhite()
{//set to default settingsred = 0.4;yellow = 0.6;green = 0.4;cyan = 0.6;blue = 0.2;magenta = 0.8;
}BlackWhite::~BlackWhite() {
}int BlackWhite::adjust(InputArray src, OutputArray dst)
{Mat input = src.getMat();if( input.empty() ) {return -1;}dst.create(src.size(), src.type());Mat output = dst.getMat();int blackWhiteParams[6];blackWhiteParams[0] = CLIP_RANGE(red     * 100, -100, 100);blackWhiteParams[1] = CLIP_RANGE(yellow  * 100, -100, 100);blackWhiteParams[2] = CLIP_RANGE(green   * 100, -100, 100);blackWhiteParams[3] = CLIP_RANGE(cyan    * 100, -100, 100);blackWhiteParams[4] = CLIP_RANGE(blue    * 100, -100, 100);blackWhiteParams[5] = CLIP_RANGE(magenta * 100, -100, 100);const uchar *in;uchar *out;int channels  = input.channels();int rows = input.rows;int cols = input.cols;uchar gray;int tmp;int values[3];int indexes[3];int ratio_max;int ratio_max_mid;for (int y = 0; y < rows; y ++ ){in = input.ptr<uchar>(y);out = output.ptr<uchar>(y);for (int x = 0; x < cols; x ++){//read RGB into values, set index in indexes.values[0] = in[0]; values[1] = in[1]; values[2] = in[2];indexes[0]=INDEX_BLUE; indexes[1]=INDEX_GREEN; indexes[2]=INDEX_RED;//sort values and indexesif ( values[1] > values[0] ) {SWAP(values[0], values[1], tmp);SWAP(indexes[0], indexes[1], tmp);}if ( values[2] > values[1] ) {SWAP(values[1], values[2], tmp);SWAP(indexes[1], indexes[2], tmp);}if ( values[1] > values[0] ) {SWAP(values[0], values[1], tmp);SWAP(indexes[0], indexes[1], tmp);}//get ratio_maxratio_max = blackWhiteParams[ indexes[0] ];//calculate ratio_max_midif ( indexes[0] == INDEX_RED ) {tmp = (indexes[1] == INDEX_GREEN) ? INDEX_YELLOW : INDEX_CYAN;} else  if ( indexes[0] == INDEX_GREEN ) {tmp = (indexes[1] == INDEX_RED) ? INDEX_YELLOW : INDEX_CYAN ;} else {tmp = (indexes[1] == INDEX_RED) ? INDEX_MAGENTA : INDEX_CYAN;}ratio_max_mid = blackWhiteParams[ tmp ];//calculate gray =  (max - mid) * ratio_max + (mid - min) * ratio_max_mid + mingray = COLOR_RANGE ( ((values[0] - values[1]) * ratio_max +(values[1] - values[2]) * ratio_max_mid + values[2] * 100) / 100 );//save to ouput*out++ = gray;*out++ = gray;*out++ = gray;//move pointer forwardin += 3;for (int j = 0; j < channels - 3; j++) {*out++ = *in++;}}}return 0;}} /* namespace cv */

【完整演示代码下载】

https://download.csdn.net/download/FL1623863129/89633221

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

相关文章:

  • Emacs23.x版本之重要特性及用法实例(一百五十六)
  • 机器学习 第11章-特征选择与稀疏学习
  • Grok 2携AI图片生成重生
  • 使用Nexus搭建Maven私服仓库
  • 云计算day27
  • 关于HTTP HEAD介绍
  • WPF Mvvm
  • pnpm【实用教程】2024最新版
  • C#的前沿技术有哪些?
  • Vue2移动端(H5项目)项目基于vant封装图片上传组件(支持批量上传、单个上传、回显、删除、预览、最大上传数等功能)---解决批量上传问题
  • ELK整合实战,filebeat和logstash采集SpringBoot项目日志发送至ES
  • 网络编程:OSI协议,TCP/IP协议,IP地址,UDP编程
  • QtExa001自动包装流水线的框架设计vs2019QT
  • SpringBoot拦截器的使用介绍
  • Spring Boot应用中的资源分离与高效打包实践
  • 分析 avformat_open_input 数据读取过程
  • Apache HOP (Hop Orchestration Platform) VS Data Integration (通常被称为 Kettle)
  • 如何判断一个dll/exe是32位还是64位
  • 加速网页加载,提升用户体验:HTML、JS 和 Vue 项目优化全攻略
  • LVS服务器基础环境配置
  • 【Python OpenCV】使用OpenCV实现两张图片拼接
  • springboot jar -jar centos后台运行的几种方式
  • 【GitLab】使用 Docker 安装 GitLab:配置 SSH 端口
  • 【pdf文件生成】如何将盖章的文件生成PDF文件
  • 铝壳电阻在电路中的作用和影响是什么?
  • # Python 判断入参日期是周几
  • 井字棋游戏(HTML+CSS+JavaScript)
  • HTML 列表和容器元素——WEB开发系列10
  • Java数组的高级使用技巧与性能优化
  • python spyne报No module named ‘http.cookies‘的解决