/*
* BlackWhite Adjust
*
* Author: JoStudio
*/
#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 settings
red = 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 indexes
if ( 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_max
ratio_max = blackWhiteParams[ indexes[0] ];
//calculate ratio_max_mid
if ( 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 + min
gray = 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 forward
in += 3;
for (int j = 0; j < channels - 3; j++) {
*out++ = *in++;
}
}
}
return 0;
}
} /* namespace cv */
JoStudio
- 粉丝: 1105
- 资源: 29
最新资源
- CTF - Misc - 图片隐写 - 002-dog
- 包含思科 Nexus 交换机全系列的命名规则,以及相关板卡、交换矩阵的命名细节
- QtScrcpy-win-x64-v3.0.1.zip
- MobaXterm-Portable-v24 是一款多功能远程管理工具,支持SSH、X11、SFTP等协议,适用于Windows、Linux和Unix系统
- 定子组装机自动摆料版3D图纸和工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 屏幕磁铁组装检测设备工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 毕设-struts+hibernate实现的网络购物系统
- 富士施乐s1810维修手册:故障诊断与维护标准流程(只有第一到第三章)
- visio:华为、戴尔、惠普服务器模具下载
- c&c++课程设计KTV歌曲系统,学生档案管理系统,个人收支系统,职工管理系统等.zip
- c&c++课程设计-学生成绩管理系统.zip
- 10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等.zip
- 毕设-期刊信息管理系统(SQL).zip
- 毕设-基于PHP的图片共享系统的设计与实现.zip
- visio:华为、戴尔、惠普服务器模具下载
- visio:华为、戴尔、惠普服务器模具下载
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页