首页 文章

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

提问于
浏览
2

在这里,我使用带有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

    这是一个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

  • 1

    (1)使用标记为IMREAD_UNCHANGED的Alpha通道读取PNG . (2)然后拆分通道并获得alpha . (3)其他步骤......

    import java.util.*;
    import org.opencv.core.*;
    import org.opencv.imgproc.Imgproc;
    import org.opencv.imgcodecs.Imgcodecs;
    
    public class xtmp{
        public static void main(String[] args){
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
            test();
        }
        static void test(){
            // Read with alpha channel 
            Mat img = Imgcodecs.imread("transparent.png", Imgcodecs.IMREAD_UNCHANGED);
            // Split the channels and get the alpha 
            List<Mat> bgra = new ArrayList<Mat>(4);
            Core.split(img, bgra) ;
            // Save 
            Mat alpha = bgra.get(3);
            Imgcodecs.imwrite("alpha.png", alpha);
        }
    }
    

    透明:

    enter image description here

    Α:

    enter image description here

  • 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);
    

相关问题