AHF*_*AHF 11 c++ opencv image image-processing computer-vision
这是我从网络资源中读取的定义
第一是
Midtone: Situated between the darkest tone (Black), and the brightest tone (White). For a 24 bit colour image, this occurs when Red = Green = Blue = 128.
另一个是
Tones created by dots between 30% and 70% of coverage
Run Code Online (Sandbox Code Playgroud)
和
Midtone also refers to the range of colors that aren't mixed with black (the shadows) or white (the highlights).
我从这些定义得到的是,值为0或255的像素我们应该将它们调整为128.我的定义是正确的吗?根据我的知识,我不想使用直方图均衡的方法,它也用于图像的亮度
我想执行下面的功能,就像我想要执行此功能OpenCV C++
但我不知道如何处理Midtones和CYMK值,因为它同时具有RGB和CMYK
例如样品图像
应用上述值后
我想在OpenCV中做同样的事情
如果我们只用RGB执行此操作,我的关注点就是结果
编辑
安德烈的回答很好但仍在等待最佳答案,因为其他图像很难调整其他图像的其他颜色平衡值
And*_*dov 10
我认为在这种情况下,Shadows,Midtones和Highlights定义了轨迹栏值的范围.
它允许快速和精确的色彩校正.
代码段:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <functional>
#include <algorithm>
#include <numeric>
#include <cstddef>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int val_Cyan_Red=0;
int val_Magenta_Green=0;
int val_Yellow_Blue=0;
Mat result;
Mat Img;
void on_trackbar( int, void* )
{
float SH=0.1; // The scale of trackbar ( depends on ajusting mode Shadows/Midtones/Highlights )
float cr_val=(float)val_Cyan_Red/255.0;
float mg_val=(float)val_Magenta_Green/255.0;
float yb_val=(float)val_Yellow_Blue/255.0;
// Cyan_Red
float R1=0;
float G1=1;
float B1=1;
float R2=1;
float G2=0;
float B2=0;
float DR=(1-cr_val)*R1+(cr_val)*R2-0.5;
float DG=(1-cr_val)*G1+(cr_val)*G2-0.5;
float DB=(1-cr_val)*B1+(cr_val)*B2-0.5;
result=Img+(Scalar(DB,DG,DR)*SH);
// Magenta_Green
R1=1;
G1=0;
B1=1;
R2=0;
G2=1;
B2=0;
DR=(1-mg_val)*R1+(mg_val)*R2-0.5;
DG=(1-mg_val)*G1+(mg_val)*G2-0.5;
DB=(1-mg_val)*B1+(mg_val)*B2-0.5;
result+=(Scalar(DB,DG,DR)*SH);
// Yellow_Blue
R1=1;
G1=1;
B1=0;
R2=0;
G2=0;
B2=1;
DR=(1-yb_val)*R1+(yb_val)*R2-0.5;
DG=(1-yb_val)*G1+(yb_val)*G2-0.5;
DB=(1-yb_val)*B1+(yb_val)*B2-0.5;
result+=(Scalar(DB,DG,DR)*SH);
imshow("Result",result);
waitKey(10);
}
// ---------------------------------
//
// ---------------------------------
int main( int argc, char** argv )
{
namedWindow("Image",cv::WINDOW_NORMAL);
namedWindow("Result");
Img=imread("D:\\ImagesForTest\\cat2.jpg",1);
Img.convertTo(Img,CV_32FC1,1.0/255.0);
createTrackbar("CyanRed", "Image", &val_Cyan_Red, 255, on_trackbar);
createTrackbar("MagentaGreen", "Image", &val_Magenta_Green, 255, on_trackbar);
createTrackbar("YellowBlue", "Image", &val_Yellow_Blue, 255, on_trackbar);
imshow("Image",Img);
waitKey(0);
}
Run Code Online (Sandbox Code Playgroud)
大约上述值的结果(零偏移为128):