Попытка изменить цвет маленького изображения в формате png с помощью OpenCV (Java) - PullRequest
0 голосов
/ 09 мая 2018

Здесь я использую OpenCV lib с java, чтобы изменить прозрачную часть на Белый и формы внутри него на черный цвет и немного толстый. Я пытался использовать 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 голосов
/ 09 мая 2018

(1) Прочитайте PNG с Alpha channel с флагом IMREAD_UNCHANGED.

(2) Затем разделите каналы и получите альфа.

(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

Alpha:

enter image description here

0 голосов
/ 09 мая 2018

Я только что понял это с помощью ответа @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);
0 голосов
/ 09 мая 2018

Это код 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

...