Интерпретация цветовой функции и настройка значений пикселей

Вот определение, которое я читаю из сетевого источника

1st -

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 в том же время

enter image description here

Например Пример изображения

enter image description here

После применения вышеуказанных значений

enter image description here

Я хочу сделать то же самое в OpenCV

Меня беспокоит только результат, если мы сможем выполнить это только с RGB

ИЗМЕНИТЬ

Ответ от Андрея хорош, но все еще ждет лучшего ответа, так как этот ответ затрудняет для других изображений корректировку других значений цветового баланса.

Ответ 1

Я думаю, что в этом случае Shadows, Midtones и Highlights определяют диапазон значений трекболов.

  • Тени - точная настройка (малый диапазон);
  • Midtones - средняя настройка (средний диапазон);
  • Основные моменты - большая настройка (широкий диапазон).

Позволяет быстро и точно корректировать цвет.

Фрагмент кода:

#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);
}

Результат для приблизительно приведенных выше значений (смещение нуля равно 128): enter image description here

Ответ 2

Области среднего тона - промежуточные затененные области на любом изображении, почти на полпути между самой яркой и самой темной областью изображения, не обязательно, чтобы они составляли около 128. В случае переэкспонированного изображения средние тона область будет гораздо более высокой по сравнению с темным или недоэкспонированным изображением.  Однако, если вы выполняете выравнивание гистограмм, тогда для него будет установлено значение, близкое к 128 [для 8-битного изображения].

Что касается того, как получить середину тональной области, я думаю, вы можете просто получить эту информацию из histrogram.

  • преобразуйте изображение в серое.
  • Получить гистограмму.
  • Уравнивание гистограмм.
  • Теперь значения централизованного пересечения (например, между 255/3 и 2 * 255/3) средние тона.

Ответ 3

Используйте функцию разделения OpenCV для разделения изображения на красный, зеленый и синий каналы.

Теперь, по внешнему виду второго изображения, кажется, что блюз и зелень более заметны, а красные подавляются. Итак, разделите красный канал, скажем, на 1.5.

Затем используйте функцию слияния OpenCV для рекомбинации каналов. Теперь у вас одинаковое изображение, но красные слабее, чем блюз и зелень, и это должно привести к желаемому изображению.