2012-10-08 2 views
2

나는 자바로 사진 모자이크를 쓰고 있습니다. 이를 위해 2 개의 이미지 중 RGB를 계산하여 비교하고 대상 이미지를 가장 적합한 타일 이미지로 대체해야합니다. 가장 적절하게 말하자면 정확한 RGB 일치를 찾지 못하면 d이라는 오류가 허용됩니다.자바에서 2 개의 이미지 중 RGB를 비교하십시오.

내가 RGB를 계산하기 위해 다음 코드를 사용하고 있습니다 :

protected static int calcRGBForEachFile(String filePath) throws IOException { 

     int RGBTotal = 0; 

     try{ 
      BufferedImage tile = ImageIO.read(new File(filePath)); 
      tileWidth = tile.getWidth(); 
      tileHeight = tile.getHeight(); 

      for(int i=0; i<tileWidth; i++){ 
       for(int j=0; j<tileHeight; j++){ 
        RGBTotal = getPixelData(tile.getRGB(i,j)); 
       } 
      } 
      } 
     catch(IOException e){ 
      System.out.println(e); 
     } 
     return RGBTotal; 
    } 

    protected static void getPixelData(int rgb) { 
     int red = (rgb >> 16) & 0xff; 
     int green = (rgb >> 8) & 0xff; 
     int blue = (rgb) & 0xff; 

    } 

는 그것이 무엇을하는가 주어진 경로에서 이미지를 소요, ​​그 RGB를 계산하고 HashMap에 저장.

더 나은 결과를 얻으려면 RGB를 계산하여 두 이미지를 비교하는 더 좋은 방법이 있습니까?

편집 : 일부 의견을 기반으로 질문을 편집했습니다.

+2

'total'의 두 값이 완전히 다를 수 있으므로 예를 들어 모든 값을 함께 추가하면 안됩니다. 색상 1 = R : 50G : 50B : 50, 색상 2 = R : 150G : 0B : 0. 완전히 다른 색상입니다. – Kinected

+2

Kinected가 말한 바. 각 샘플/구성 요소를 개별적으로 비교하고 추가하지 않고 합계를 비교해야합니다. – aroth

+0

@Kinected : 저는 이것을 알고 있습니다. 내가 RGB를위한 하나의 값을 얻었고 (쉬운 저장과 비교를 위해서) 3이 아니기 때문에 내가 이것을하는 유일한 이유가있다. 좋은 방법으로 계산하고 비교할 방법을 찾으면 그 문제를 처리 할 것입니다. – Intern

답변

3

인간의 인식 (대략)에 따라 이미지를 비교하는 가장 좋은 방법 중 하나는 SSIM입니다.

각 픽셀의 R, G 및 B 값을 비교해보고 조금 더 노력하여 사람의 눈 감도 (예 : Von Kries's method 참조)에 따라 각 색상에 가중치를 부여 할 수 있습니다. 이미지가 너무 가까이 있지 않고 크기가 같지 않으면 원하는대로 잘 작동하지 않습니다.

저장 형식 권장 프로그램 (PNG vs JPG) 인 ImageGuide을 작성했는데 그 소스는 (공개) 소스의 목적에 부합하는 간단한 이미지 비교 알고리즘이 포함되어 있습니다. 시작하는 데 도움이 될 수 있습니다.

+0

상용 사진 모자이크 프로그램이이를 수행해야 할 수도 있습니다. 그러나 이것이 얼마나 효과가 있을까요? @Internals : 모자이크와 프로그램에 대한 시청자는 누구입니까? –

+0

@ StuartR.Jefferys : 답변 해 주셔서 감사합니다. 나는 당신이 준 링크를 확인하고있다. 그리고이 응용 프로그램은 상업적이지 않습니다. 우리가 작업하고있는 프로젝트를위한 것입니다. – Intern

관련 문제