这是我从网络资源中读取的定义
第一是
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
和
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
编辑
安德烈的回答很好,但仍然等待最佳答案,因为这个答案对于其他图像来说很难调整其他颜色平衡值
解决方法
我认为在这种情况下,阴影,中间色和亮点定义了轨迹值的范围.
阴影 – 精确调整(小范围);
中级 – 中等调整(中等范围);
>亮点 – 调整重(范围广).
它允许快速和精确的颜色校正.
代码段:
#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,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,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",&val_Magenta_Green,on_trackbar); createTrackbar("YellowBlue",&val_Yellow_Blue,on_trackbar); imshow("Image",Img); waitKey(0); }
对于大约上述值的结果(零偏移为128):