首页 > 解决方案 > 尝试使用 OpenCV (Java) 更改小 png 图像的颜色

问题描述

在这里,我使用带有 java 的 OpenCV lib 将透明部分更改为白色,并将其内部的形状更改为黑色和小粗。我尝试使用 cvtColor(img, hsv, Imgproc.COLOR_BGR2GRAY); 但整个图像变为灰色。我需要帮助

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

图片

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

处理后输出图像:

图片

标签: javaopencvimage-processingopencv3.0javacv

解决方案


(1) 阅读PNG带有Alpha channel标志的 with IMREAD_UNCHANGED

(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);
    }
}

透明的:

在此处输入图像描述

Α:

在此处输入图像描述


推荐阅读