【问题标题】:Trying to change color of a small png image using OpenCV (Java)尝试使用 OpenCV (Java) 更改小 png 图像的颜色
【发布时间】:2018-05-09 07:26:56
【问题描述】:

在这里,我使用 OpenCV lib 和 java 将透明部分更改为白色,并将其上的形状更改为黑色和稍厚。我尝试使用 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);

处理后的输出图像:

【问题讨论】:

  • 如果您将格式设置为COLOR_BGR2GRAY,您期望会发生什么?
  • OpenCV 新手.. 它可能会将整个颜色更改为灰色?
  • 可以把整个颜色改成白色,把形状改成黑色吗?

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


【解决方案1】:

(1) 读取PNGAlpha channel 和标志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);
    }
}

透明:

阿尔法:

【讨论】:

  • 谢谢兄弟,我已经找到解决方案了..让我也试试这个
  • 先生,可以在那个正方形部分填充(任何)颜色吗?
【解决方案2】:

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

【讨论】:

  • 感谢兄弟的帮助。我刚刚将您的 C++ 转换为 Java,它运行得 100% 好
【解决方案3】:

我刚刚在@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);

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2018-06-20
    • 2018-07-25
    相关资源
    最近更新 更多