应用颜色时将阴影应用于图像

时间:2013-12-26 04:39:07

标签: ios

我正在根据HSV的3个滑块值更改汽车的颜色。我能够改变颜色,但感觉就像油漆。颜色变化后图像中没有原创性。我如何应用阴影和效果。

如何应用输入图像中的阴影和效果。

1 个答案:

答案 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 );
}

Color1 Color2 Color3 Color4

修改: -

根据以下评论,这里是通过保持阴影使用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 );*/

}

在上面的代码中,您将通过取消注释注释代码来获得相同的结果。

<强>结果: -
enter image description here enter image description here

enter image description here enter image description here