2013-12-26 2 views
3

Я меняю цвет автомобиля на основе значений 3 ползунков для HSV. Я могу изменить цвет, но он чувствует себя как paint.There нет оригинальности в изображении после изменения цвета. Как я могу применять оттенки и эффекты.Применение оттенков к изображению при нанесении цвета

Как применять оттенки и эффекты, как на входном изображении.

+1

Странно, что вы используете ползунок RGB для HSV ... Просто чтобы убедиться, является выход "краски, как" если вы только изменение * оттенок *? – Mahm00d

+0

@ Mahm00d это просто слайдер, принимающий значения hsv. Я назвал их красно-зелеными синими. это все. – slaveCoder

+0

Вы не ответили на мой вопрос: каков ваш результат, когда вы только меняете оттенок, а не насыщенность/значение? Потому что изменение в * hue * не повлияло бы на изменение «тени» или освещения на фигуре, только цвет. – Mahm00d

ответ

4

Привет, вы можете ссылаться на код ниже на C++, здесь я изменяю только значение оттенка, и если вы хотите изменить насыщенность и значение, просто создайте Mat со значением положения ползунка и добавьте или вычтите с соответствующим каналом (sat или val).

int H=50; 
Mat src, hsv, dst; 
char window_name[30] = "HSV Demo"; 
void HSV_Demo(int, void*); 


int main(int argc, char** argv){ 

    src = imread("car.jpg", 1); 
    namedWindow(window_name, CV_WINDOW_AUTOSIZE); 
    createTrackbar("Hue", window_name,&H, 179, HSV_Demo); 
    HSV_Demo(0, 0); 

    while(true) 
    { 
    int c; 
    c = waitKey(20); 
    if((char)c == 27) 
    break; 

    if((char)c == 's') imwrite("result.jpg",dst); 

    } 

} 


void HSV_Demo(int, void*) 
{ 
    cvtColor(src, hsv,CV_BGR2HSV); 
    Mat channel[3]; 
    split(hsv,channel); 
    channel[0].setTo(H); 
    Mat tmp[3] = { channel[0],channel[1],channel[2] }; 
    merge(tmp,3,dst); 
    cvtColor(dst, dst,CV_HSV2BGR); 
    imshow(window_name, dst); 
} 

Color1Color2 Color3Color4

Edit: -

Основываясь на комментарий ниже здесь является шагом для создания черно-белое изображение с помощью HSV, сохраняя оттенки.

Обратите внимание, что метод ниже не идеален, поскольку вы можете видеть, что края имеют нерегулярность, но вы можете попробовать что-то вроде ниже или улучшить метод ниже.

Идея проста: мы рассмотрим только канал значений и добавим некоторую константу (положение ползунка) для создания белого и вычитания для создания черного, а затем преобразуем его в изображение BGR с помощью cvtColor(). Оттенки могут исчезнуть, если результат сложения или вычитания не связан.

Перед добавлением или вычитанием мы создадим изображение маски, сегментируя оттенок (здесь красный) и создадим новый Мат с константой (положение ползунка) и маску, чтобы фон оставался неизменным при добавлении или вычитании.

void HSV_Demo(int, void*) 
{ 
    cvtColor(src, hsv,CV_BGR2HSV); 
    Mat channel[3]; 
    split(hsv,channel); 

    Mat thr1,thr2; 
    inRange(hsv,Scalar(165,50,50),Scalar(179,255,255), thr1); //Create mask to change to avoid background 
    inRange(hsv,Scalar(0,50,50),Scalar(10,255,255), thr2); //Create mask to change to avoid background 
    thr1=thr1+thr2; 

    if(H>255){ 
    if(H) H-=255; 
    thr1.setTo(H,thr1); //Set the image to add to value which will create white color 
    // channel[1].setTo(0); 
    channel[2]=channel[2]+thr1; 
    } 

    else { 
    H=255-H; 
    thr1.setTo(H,thr1); 
    // channel[1].setTo(0); 
    channel[2]=channel[2]-thr1;//Set the image to subtract from value which will create black color 
    } 

    //Convert single channel to BGR 
    Mat BGR; 
    cvtColor(channel[2], BGR,CV_GRAY2BGR); 
    imshow(window_name, BGR); 


/* Mat tmp[3] = { channel[0],channel[1],channel[2] }; 
    merge(tmp,3,dst); 
    cvtColor(dst, dst,CV_HSV2BGR); 
    imshow(window_name, dst);*/ 

} 

В вышеуказанном коде вы получите тот же результат, раскомментировав прокомментированный код.

Результат: -
enter image description here enter image description here

enter image description here enter image description here

+1

+1 Ницца. Вот как люди должны отвечать на вопросы [тег: обработка изображений] на Stackoverflow. – karlphillip

+0

@Haris Могу ли я сначала сохранить S и V всего изображения в матрице и применить это при изменении цвета. Есть ли способ сделать это? – slaveCoder

+1

@slaveCoder Используя нижеприведенный код, вы можете получить по каждому каналу 'cvtColor (src, hsv, CV_BGR2HSV); Матовый канал [3]; split (hsv, channel); канала [0] // Оттенок канал [1] // насыщение канала [2] // value' – Haris

Смежные вопросы