Привет, вы можете ссылаться на код ниже на 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);
}
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);*/
}
В вышеуказанном коде вы получите тот же результат, раскомментировав прокомментированный код.
Результат: -
Странно, что вы используете ползунок RGB для HSV ... Просто чтобы убедиться, является выход "краски, как" если вы только изменение * оттенок *? – Mahm00d
@ Mahm00d это просто слайдер, принимающий значения hsv. Я назвал их красно-зелеными синими. это все. – slaveCoder
Вы не ответили на мой вопрос: каков ваш результат, когда вы только меняете оттенок, а не насыщенность/значение? Потому что изменение в * hue * не повлияло бы на изменение «тени» или освещения на фигуре, только цвет. – Mahm00d