2013-01-25 2 views
0

Android의 이미지에서 히스토그램을 생성하고 싶습니다. 내가 자바에서 몇 가지 예를 찾았지만, 나는 그 어떤 포팅도 성공하지 못했다.android의 이미지에서 히스토그램 그래프를 생성하는 방법

다음은 내가 사용한 코드입니다. 현재 javax.imageio.ImageIo 클래스에 NoClassDefFoundException이 있습니다.

public static byte[] histogramEqualization(String path) { 

     int red; 
     int green; 
     int blue; 
     int alpha; 
     int newPixel = 0; 

     original = null; 
     try { 
      original = ImageIO.read(new URL(path)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Get the Lookup table for histogram equalization 
     ArrayList<int[]> histLUT = histogramEqualizationLUT(original); 

     BufferedImage histogramEQ = new BufferedImage(original.getWidth(), original.getHeight(), original.getType()); 

     for(int i=0; i<original.getWidth(); i++) { 
      for(int j=0; j<original.getHeight(); j++) { 

       // Get pixels by R, G, B 
       alpha = new Color(original.getRGB (i, j)).getAlpha(); 
       red = new Color(original.getRGB (i, j)).getRed(); 
       green = new Color(original.getRGB (i, j)).getGreen(); 
       blue = new Color(original.getRGB (i, j)).getBlue(); 

       // Set new pixel values using the histogram lookup table 
       red = histLUT.get(0)[red]; 
       green = histLUT.get(1)[green]; 
       blue = histLUT.get(2)[blue]; 

       // Return back to original format 
       newPixel = colorToRGB(alpha, red, green, blue); 

       // Write pixels into image 
       histogramEQ.setRGB(i, j, newPixel); 

      } 
     } 

     //create a ByteArrayOutputStream 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] imageInByte = null; 
     //write our image to it 
     try { 
      ImageIO.write(histogramEQ, "png", baos); 
      //flush the stream 
      baos.flush(); 

      //get the image in byte form 
      imageInByte = baos.toByteArray(); 

      //close the stream 
      baos.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 




//  return histogramEQ; 
     return imageInByte; 

    } 

    // Get the histogram equalization lookup table for separate R, G, B channels 
    public static ArrayList<int[]> histogramEqualizationLUT(BufferedImage input) { 

     // Get an image histogram - calculated values by R, G, B channels 
     ArrayList<int[]> imageHist = imageHistogram(input); 

     // Create the lookup table 
     ArrayList<int[]> imageLUT = new ArrayList<int[]>(); 

     // Fill the lookup table 
     int[] rhistogram = new int[256]; 
     int[] ghistogram = new int[256]; 
     int[] bhistogram = new int[256]; 

     for(int i=0; i<rhistogram.length; i++) rhistogram[i] = 0; 
     for(int i=0; i<ghistogram.length; i++) ghistogram[i] = 0; 
     for(int i=0; i<bhistogram.length; i++) bhistogram[i] = 0; 

     long sumr = 0; 
     long sumg = 0; 
     long sumb = 0; 

     // Calculate the scale factor 
     float scale_factor = (float) (255.0/(input.getWidth() * input.getHeight())); 

     for(int i=0; i<rhistogram.length; i++) { 
      sumr += imageHist.get(0)[i]; 
      int valr = (int) (sumr * scale_factor); 
      if(valr > 255) { 
       rhistogram[i] = 255; 
      } 
      else rhistogram[i] = valr; 

      sumg += imageHist.get(1)[i]; 
      int valg = (int) (sumg * scale_factor); 
      if(valg > 255) { 
       ghistogram[i] = 255; 
      } 
      else ghistogram[i] = valg; 

      sumb += imageHist.get(2)[i]; 
      int valb = (int) (sumb * scale_factor); 
      if(valb > 255) { 
       bhistogram[i] = 255; 
      } 
      else bhistogram[i] = valb; 
     } 

     imageLUT.add(rhistogram); 
     imageLUT.add(ghistogram); 
     imageLUT.add(bhistogram); 

     return imageLUT; 

    } 

    private static int colorToRGB(int alpha, int red, int green, int blue) { 

     int newPixel = 0; 
     newPixel += alpha; newPixel = newPixel << 8; 
     newPixel += red; newPixel = newPixel << 8; 
     newPixel += green; newPixel = newPixel << 8; 
     newPixel += blue; 

     return newPixel; 

    } 

    public static ArrayList<int[]> imageHistogram(BufferedImage input) { 

     int[] rhistogram = new int[256]; 
     int[] ghistogram = new int[256]; 
     int[] bhistogram = new int[256]; 

     for(int i=0; i<rhistogram.length; i++) rhistogram[i] = 0; 
     for(int i=0; i<ghistogram.length; i++) ghistogram[i] = 0; 
     for(int i=0; i<bhistogram.length; i++) bhistogram[i] = 0; 

     for(int i=0; i<input.getWidth(); i++) { 
      for(int j=0; j<input.getHeight(); j++) { 

       int red = new Color(input.getRGB (i, j)).getRed(); 
       int green = new Color(input.getRGB (i, j)).getGreen(); 
       int blue = new Color(input.getRGB (i, j)).getBlue(); 

       // Increase the values of colors 
       rhistogram[red]++; ghistogram[green]++; bhistogram[blue]++; 

      } 
     } 

     ArrayList<int[]> hist = new ArrayList<int[]>(); 
     hist.add(rhistogram); 
     hist.add(ghistogram); 
     hist.add(bhistogram); 

     return hist; 

    } 

여기에 오류가 있습니다.

01-25 18:05:37.548: E/AndroidRuntime(3514): FATAL EXCEPTION: main 
01-25 18:05:37.548: E/AndroidRuntime(3514): java.lang.NoClassDefFoundError: javax.imageio.ImageIO 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at com.example.histogramsample.MainActivity.histogramEqualization(MainActivity.java:57) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at com.example.histogramsample.MainActivity.onCreate(MainActivity.java:33) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.Activity.performCreate(Activity.java:4465) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.ActivityThread.access$600(ActivityThread.java:128) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.os.Looper.loop(Looper.java:137) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at android.app.ActivityThread.main(ActivityThread.java:4514) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
01-25 18:05:37.548: E/AndroidRuntime(3514):  at dalvik.system.NativeStart.main(Native Method) 

답변

0

이 줄 :

java.lang.NoClassDefFoundError: javax.imageio.ImageIO 

프로젝트에 연결된 모든 적절한 코드 라이브러리가없는 지적했다. 이 클래스를 사용할 수 있는지 확인해야합니다.

+0

나는 이것을 위해 필요한 모든 라이브러리를 연결했다. 내 프로젝트에 첨부 된 JRE 시스템 라이브러리의 라이브러리를 볼 수 있습니다. – Alex

+0

두 번 확인해 봅니다. 예외는 다른 것을 나타냅니다. – Booger

0

javax.imageio.ImageIO는 Dalvik 시스템에는 존재하지 않는 JRE의 클래스입니다. 그래서 코드는 안드로이드가 아닌 전통적인 자바 머신 (JRE, 나는 의미한다)에서 돌아갈 것이다. 해결책 :

  1. Android에서 ImageIO의 래퍼 클래스를 찾으십시오.
  2. 원하는대로 정확히 수행하는 ImageIO와 같은 클래스를 작성하십시오.
관련 문제