2016-10-25 29 views
0

让我解释一下我的问题。我有一个服务,做一些数学计算(非常非常困难)。这是某种统计计算。此服务返回布尔值的二维数组(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); 

enter image description here

的代码相当简单。结果我创建Pic1(见附件)。例如黄色边框以及黄色点(图像像素)。 此外,我想告诉你布尔数组的某些内容(这是唯一的例子,我将打印为1 true和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来实现我的目标。我不知道。可能有一些图书馆或其他可以帮助我的东西。

我会为任何答复和帮助提供补充,谢谢。

+1

您可以考虑在[I,J]“1”为点(x = j的,Y = i)并使用一系列Bezier曲线或样条插补它。 – loginpassword

+0

按下“-1”很容易,但是您可以通过示例稍微扩展您的答案吗?我给出数组的例子,因为围绕具有值“1”的点也有值为“1”的点,问题也是我不知道顺序。这些点。在这个数组中,我不知道选中的[i,j]点后面的点。我正在尝试解决我的问题,但不会提高我的评分。 –

回答

0

我认为你想要做的是这个技术MSGPR(或see here),这是一个多尺度平滑匹配轮廓技术。

所以基本上作者认为模式轮廓为parametric equation。然后用高斯滤波器分别平滑曲线x [t]和y [t]。你越平滑,轮廓越简单。

+0

感谢您的回答。它对我非常有帮助。下面我添加我的解决方案。 –

0

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