【问题标题】:How to smooth or process image pixels that represent closed line?如何平滑或处理代表闭合线的图像像素?
【发布时间】:2016-11-22 01:52:50
【问题描述】:

让我解释一下我的问题。我有一项服务可以进行一些数学计算(非常非常困难)。这是某种统计计算。此服务返回布尔值的二维数组 (boolean [][] 400x400)。在我创建对应于该数组的图像后:

BufferedImage im = new BufferedImage( area.length, area.length, BufferedImage.TYPE_INT_RGB );
Graphics2D g2 = in.createGraphics();
g2.setColor( Color.BLACK);
for ( int i = 0; i < area.length; i++ ) {
   for ( int j = 0; j < area.length; j++ ) {
      if ( area[ i ][ j ] ) {
           g2.fillRect( j, i, 1, 1 );
      }            
   }
}
ImageIO.write( im, someformat, somefile );

代码很简单。结果我创建了 Pic1(见附件)。黄色边框只是例如黄色点(图像像素)。 我还想向您展示一些布尔数组的内容(这只是示例,我将打印 true 为 1 和 false 为 0 ):

{ 0,.0,.............   .... ............0    }
 ....................   ...
{ 0,0,0,0,0,1,1,....   .... ............0    }
{ 0,0,0,1,1,0,1,....   .... ............0    }
{ 0,0,1,1,0,0,0,1,1,   .... ............0    }
{ 0,0,0,1,0,0,0,1,0,   .... ............0    }
 ..................................
{ 0,.0,.............   .... ............0    }

因此,正如我所说的那样,我得到了 Pic1。是的,我知道这张照片看起来很奇怪。在实践中,它可以是任何形状,但它始终是封闭的。这张图片看起来很丑,相反我想把它画成一条有一定宽度且没有任何粗糙度的曲线。我试图在 Pic2 上展示它(是的.....它也很丑......我的画很糟糕)。

我在图像处理方面的技能和知识很差,我绝对需要帮助和澄清。可能根本不可能使用 Java 实现我的目标。我不知道。可能有一些图书馆或其他可以帮助我的东西。

我会感谢任何回复和帮助,谢谢。

【问题讨论】:

  • 您可以将 [i,j] 处的“1”视为点 (x = j, y = i),并使用一系列贝塞尔曲线或样条线对其进行插值。
  • 按“-1”很容易,但你能用例子来扩展你的答案吗?我给出了数组示例,因为在值“1”的点周围也有值“1”的点,问题也是我不知道顺序。这些点。在这个数组中,我不知道后面跟着选定的 [ i,j ] 点的点。我正在尝试解决我的问题,但没有提高我的评分。

标签: java image bufferedimage graphics2d


【解决方案1】:

我认为您想做与MSGPR(或see here)这种技术相同的事情,这是一种多尺度平滑匹配轮廓技术。

所以基本上作者将图案轮廓视为parametric equation。然后他们使用高斯滤波器分别平滑曲线 x[t] 和 y[t]。越平滑,轮廓就越简单。

【讨论】:

  • 感谢您的回答。这对我很有帮助。下面我添加我的解决方案。
【解决方案2】:

根据 FiReTiTi 的回答,我花了一些时间进行研究,终于找到了解决方案。
所以我发现了两个类似的问题first postsecond post。它们都与opencv库有关。
在阅读了一些 opencv 文档后,我解决了我的问题,只需在上面的代码中添加下一行:

    g2.dispose();
    BufferedImage result = new BufferedImage( im.getHeight(), im.getWidth(), TYPE_INT_RGB );
    g2.createGraphics();

    Mat src = new Mat( im.getHeight(), im.getWidth(), CvType.CV_8UC1 );
    src.put( 0, 0, ( ( DataBufferByte ) im.getRaster().getDataBuffer() ).getData() );
    List< MatOfPoint > contours = new ArrayList<>();
    Imgproc.findContours( src, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point( 0, 0 ) );

     for ( MatOfPoint point: contours ) {

          MatOfPoint2f source = new MatOfPoint2f();
          point.convertTo( source, CvType.CV_32F );
          MatOfPoint2f gb= new MatOfPoint2f();
          Imgproc.GaussianBlur( source, gb, new Size( 3, 3 ), 0, 0 );
          Polygon polygon = new Polygon();
          gb.toList().stream().forEach( p -> polygon.addPoint( ( int ) p.x, ( int ) p.y ) );
          g2.setColor( Color.WHITE);
          g2.drawPolygon( polygon );
     }

     ImageIO.write( result, format, file );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2020-02-16
    • 2019-10-18
    • 2019-07-17
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多