Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing Javafx图片到低多边形艺术转换器_Image Processing_Javafx - Fatal编程技术网

Image processing Javafx图片到低多边形艺术转换器

Image processing Javafx图片到低多边形艺术转换器,image-processing,javafx,Image Processing,Javafx,我正在尝试使用javafx制作一个程序,该程序将转换如下图片: 在这张图片中,背景并不是我喜欢的方式,但是鳄梨在中间是我想要达到的一个很好的例子。我现在有两个过滤器,可以根据亮度在图片中查找边缘,如下所示: public void processImage() { ww = (int) Math.ceil(image.getWidth()); hh = (int) Math.ceil(image.getHeight()); pixelAmount = (long) ww

我正在尝试使用javafx制作一个程序,该程序将转换如下图片:

在这张图片中,背景并不是我喜欢的方式,但是鳄梨在中间是我想要达到的一个很好的例子。我现在有两个过滤器,可以根据亮度在图片中查找边缘,如下所示:

public void processImage() {
    ww = (int) Math.ceil(image.getWidth());
    hh = (int) Math.ceil(image.getHeight());
    pixelAmount = (long) ww * (long) hh;
    pxDA = new pxInfo[ww][hh];
    PixelReader pr = image.getPixelReader();
    if(pr != null) {
        System.out.println("pixel reader found");
        WritableImage i = new WritableImage(ww, hh);
        for(int x = 0; x < ww; x++) {
            for(int y = 0; y < hh; y++) {
                Color c = pr.getColor(x, y);
                double a = c.getOpacity();
                double r = c.getRed();
                double g = c.getBlue();
                double b = c.getBlue();

                double[][] gray = new double[3][3];
                for (int j = 0; j < 3; j++) {
                    for (int k = 0; k < 3; k++) {
                        if(!((j == 0 && x == 0) || (k == 0 && y == 0) || (j 
== 2 && x == ww - 1) || (k == 2 && y == hh - 1))) {
                            Color cl = pr.getColor(x - 1 + j, y - 1 + k);
                            gray[j][k] = 0.299 * cl.getRed() +  0.587 * 
cl.getGreen() + 0.114 * cl.getBlue();
                        }
                    }
                }

                // apply filter
                double gray1 = 0, gray2 = 0;
                for (int j = 0; j < 3; j++) {
                    for (int k = 0; k < 3; k++) {
                        gray1 += gray[j][k] * filter1[j][k];
                        gray2 += gray[j][k] * filter2[j][k];
                    }
                }
                double magnitude = clamp(0.0, 1.0 - Math.sqrt(gray1 * gray1 + 
gray2 * gray2), 1.0);
                Color color = new Color(magnitude, magnitude, magnitude, 1);
                i.getPixelWriter().setColor(x, y, color);
            }
        }
        stackPane.getChildren().add(new ImageView(i));
    }
}
public void processImage(){
ww=(int)Math.ceil(image.getWidth());
hh=(int)Math.ceil(image.getHeight());
像素数量=(长)ww*(长)hh;
pxDA=新pxInfo[ww][hh];
PixelReader pr=image.getPixelReader();
如果(pr!=null){
System.out.println(“找到像素读取器”);
WritableImage i=新的WritableImage(ww,hh);
对于(int x=0;x
这部分代码运行得很好,以下是一些结果:

过滤前: 过滤后: 但问题是,我不知道从这里走到哪里。我在互联网上寻找各种各样的算法,但我真的找不到任何有明确解释的,所以我想在这里问一下。所以,如果你知道一些我可以用来改进的算法/过滤器,我想听听

还有一个部分,我实际上需要创建三角形/多边形。假设我应用了所有的过滤器等等,那么我该怎么办?比如我如何区分形状和灰度图片?任何帮助都将不胜感激

提前感谢,


Lenardjee

我对JavaFX不太熟悉,但我尝试使用PythonOpenCV解决一个非常类似的问题:

我是这样做的


一般流程:
  • 预处理图像(双边/高斯模糊以去除噪声等)
  • 从图像中获取关键点(使用下面详述的方法)
  • 从关键点获取多边形(使用Delaunay三角剖分或类似算法)
  • 着色多边形(例如,使用多边形内所有像素的平均颜色)
  • 后处理(对比度、饱和度调整等)

  • 1.预处理 在进行关键点提取之前,预处理图像有助于删除大量不必要的高频细节

    您可以使用诸如双边滤波器或高斯滤波器之类的滤波器来实现这一点

    您可能还希望在此缩小图像的比例以加快处理速度,但这并不是严格必要的


    2.关键点提取 这可能是最困难的部分,也是最需要微调/实验的部分

    您可以尝试以下几种方法:

    任何值得一试的图像处理/计算机视觉库(例如OpenCV)都应该内置此功能

    此方法提供一个布尔图像,其中潜在边标记为“True”。然后,您可以选择这些点的随机子集,并将它们转换为(X,Y)坐标(或任何您最方便的格式)

    我发现这种方法加上一点点随机化,只需要最少的调整

    这是检测图像中显著特征的另一种方法,但基于图像像素的二阶导数(与基于一阶导数的Canny滤波器相反)

    这个过滤器返回一个图像,你可以将其标准化,并将其用作权重掩码,从中随机采样一组关键点(也许有更好的方法使用过滤器,但我不介意)

    随机替换 一旦您从所有其他方法中积累了一组关键点,您可以选择用一组随机生成的关键点替换所有点的一小部分随机子集

    我发现这有助于在最终输出中引入一些美观的不规则性

    抖动关键点 除了直接替换一小部分关键点外,我还以非常小的数量“抖动”(随机翻译)每个关键点。这有助于引入更多的随机性,并允许您多次运行程序以获得一个潜在的良好输出

    注意:别忘了将图像的4个角添加为关键点,否则输出周围将出现空白/黑色区域


    3.将关键点连接到多边形中 是一种算法,它将平面上的一组点连接起来,从而使由此形成的每个三角形中的最小角度最大化。(显然,如果您不完全想要三角形,这将不起作用)