尝试使用OpenCV(Java)更改小png图像的颜色

时间:2018-05-09 07:26:56

标签: java opencv image-processing opencv3.0 javacv

这里我使用带有java的OpenCV lib将透明部分更改为白色,其中的形状更改为黑色和厚实。我试着用cvtColor(img,hsv,Imgproc.COLOR_BGR2GRAY);但是整个图像变成了灰色。我需要帮助

这是我需要更改颜色的原始图像

image

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String img_url1 = "C:\\\\Users\\\\me\\\\Desktop\\\\cpt\\\\1.png";
Mat img = Imgcodecs.imread(img_url1);
if( img.empty() ) {
    System.out.println("Error opening image!");
    System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n");
    System.exit(-1);
}


Mat hsv = new Mat();
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2GRAY);

Imgcodecs.imwrite("C:\\\\Users\\\\me\\\\Desktop\\\\cpt\\\\1-cpy.png", hsv);

处理后的图像超出:

image

3 个答案:

答案 0 :(得分:1)

  

(1)使用标记为PNG的{​​{1}}阅读Alpha channel

     

(2)然后拆分频道并获得阿尔法。

     

(3)其他步骤......

IMREAD_UNCHANGED

透明:

enter image description here

α

enter image description here

答案 1 :(得分:0)

这是一个C ++代码,但您可以轻松地将其转换为JAVA。

  Mat img = imread("image.png",-1);

  //split channels, extract 3rd channel
  std::vector<Mat> channels;
  split(img, channels);

  // convert to white background and black foreground
  Mat black;
  bitwise_not(channels.at(3), black);


  imshow("image", black);
  waitKey(0);

result

答案 2 :(得分:0)

我刚刚在@zindarod回答的帮助下弄明白了,这是解决方案

         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         String img_url1 = "C:\\\\Users\\\\me\\\\Desktop\\\\cpt\\\\1.png";
         Mat img = Imgcodecs.imread(img_url1, -1);


         List<Mat> channels = new ArrayList<>();
         Core.split(img, channels);

         Mat black = new Mat();
         Core.bitwise_not(channels.get(3), black);

         String file2 = "C:\\\\\\\\Users\\\\\\\\me\\\\\\\\Desktop\\\\\\\\cpt\\\\\\\\1-cpy.png"; 
         Imgcodecs.imwrite(file2, black);