2016-10-25 1 views
0

내 문제를 설명해 드리겠습니다. 나는 수학적 계산을하는 서비스를 가지고있다. (매우 어렵다). 일종의 통계 계산입니다. 이 서비스는 부울 값의 2 차원 배열을 반환합니다 (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과 진실과 거짓 인쇄됩니다) :

{ 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

당신은 점 (X = J, Y로 [I, J]에 "1"을 고려할 수 :
OpenCV의 문서의 일부를 읽은 후 나는 내 문제는 내 위의 코드에 다음 줄을 추가 해결 해요 = i) 베 지어 곡선 또는 스플라인 시리즈를 사용하여 보간합니다. – loginpassword

+0

"-1"을 누르기는 쉽지만 예제를 사용하여 대답을 조금 연장 할 수 있습니까? 그리고 나는 값 "1"을 가진 점들과 "1"값을 가진 점들 또한 문제가 있다는 것을 알고 있기 때문에 배열 예제를 제공합니다. 이 점들 중. 이 배열에서 나는 선택된 [i, j] 점 뒤에 오는 점을 모른다. 내 문제를 해결하려고하지만 등급을 높이려고하지 않습니다. –

답변

0

나는이 기술을 다각형 평활 매칭 윤곽 기법 인 MSGPR (또는 see here)과 똑같이하고 싶다고 생각한다.

기본적으로 저자는 패턴 윤곽을 parametric equation으로 간주합니다. 그런 다음 가우시안 필터를 사용하여 곡선 x [t]와 y [t]를 개별적으로 부드럽게합니다. 윤곽을 부드럽게할수록 윤곽이 더 단순 해집니다.

+0

답변 해 주셔서 감사합니다. 그것은 나를 아주 돕는다. 아래에 내 솔루션을 추가하십시오. –

0

FiReTiTi 대답에 따르면 나는 연구를 위해 약간의 시간을 보냈고 마침내 해결책을 찾았습니다.
그래서 두 개의 유사한 질문 first postsecond post가 있습니다. 둘 다 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); 
관련 문제