2 votes

Essayer de changer la couleur d'une petite image png en utilisant OpenCV (Java)

Ici j'utilise la librairie OpenCV avec java pour changer la partie transparente en blanc et les formes à l'intérieur en couleur noire et un peu épaisse. J'ai essayé d'utiliser cvtColor(img, hsv, Imgproc.COLOR_BGR2GRAY) ; mais l'image entière est devenue grise. J'ai besoin d'aide avec ceci

Voici l'image originale dont je dois changer la couleur.

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 Outupt après traitement :

image

1voto

Silencer Points 6351

(1) Lire le PNG con Alpha channel avec le drapeau IMREAD_UNCHANGED .

(2) Puis diviser les canaux et obtenir l'alpha.

(3) Autres étapes ...

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

Transparent :

enter image description here

Alpha :

enter image description here

0voto

zindarod Points 3976

Il s'agit d'un code C++ mais vous pouvez facilement le convertir en 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

0voto

Greeny Clicks Points 23

Je viens de trouver la solution avec l'aide de la réponse de @zindarod, voici la solution

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X