我正在根据HSV的3个滑块值更改汽车的颜色。我能够改变颜色,但感觉就像油漆。颜色变化后图像中没有原创性。我如何应用阴影和效果。
如何应用输入图像中的阴影和效果。
答案 0 :(得分: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 );
}
修改: - 强>
根据以下评论,这里是通过保持阴影使用HSV创建黑白图像的步骤。
请注意,下面的方法并不完美,因为您可以看到边缘有不规则性,但您可以尝试类似下面的内容或改进下面的方法本身。
这个想法很简单我们只考虑值通道并加上一些常量(滑块位置)来创建白色并减去创建黑色,然后使用cvtColor()将其转换为BGR图像。如果加法或减法结果超出范围,阴影可能会消失。
在添加或减去之前,我们将通过分割色调(此处为红色)创建一个蒙版图像,并使用常量(滑块位置)和蒙版创建一个新的Mat,以便在加法或减法时背景保持不变。
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 );*/
}
在上面的代码中,您将通过取消注释注释代码来获得相同的结果。
<强>结果: - 强>