2013-09-02 3 views
0

나는 손가락 이미지 처리 작업을하고 있으며 현재 정규화를 수행하려고합니다.Java의 이미지 정규화

나는이 링크를 Griuale Biometric website에서 연구했습니다.

정규화의 개념은 전체 이미지의 평균 및 분산이 사전 정의 된 값으로 변경되도록 각 픽셀의 강도를 변경하는 것입니다.

어떤 코드 나 자바의 알고리즘을 제안 해 줄 수 있습니까?

편집 : 나는 복용하고

이미지 픽셀의 MEANVARIANCE 이미지 정상화를위한 계정에 : 여기

내 코드입니다 : 내가 원하는 부드러운 이미지는 이후

public class NormalizeHistMeanVariance { 
private static BufferedImage original, normalize; 

public static void main(String[] args) throws IOException { 
    final int N = 256; // Number of graylevels 
    final int M = 250; // Max value in histogram for displaying purposes 
    int nrows, ncols, size, in_img[][], out_img[][]; 
    int i, j, max, maxgray; 
    double hist[] = new double[N], norm, mean, var, tmp; 

    String f1 = "E:/single.jpg"; 
    String f2 = "E:/normImg"; 
    File original_f = new File(f1); 
    original = ImageIO.read(original_f); 

    Histogram histogram = new Histogram(original); 
    in_img = histogram.getPixels(original); 

    nrows = in_img.length; 
    ncols = in_img[0].length; 
    size = in_img.length * in_img[0].length; 

    // Compute average gray and histogram 
    for (i = 0; i < N; i++) 
     hist[i] = 0; 
    mean = 0; 
    for (i = 0; i < nrows; i++) { 
     for (j = 0; j < ncols; j++) { 
      hist[in_img[i][j]]++; 
      mean += in_img[i][j]; 
     } 
    } 
    mean /= size; 
    System.out.println("Mean graylevel = " + mean); 

    // Compute variance 
    var = 0; 
    for (i = 0; i < nrows; i++) { 
     for (j = 0; j < ncols; j++) { 
      tmp = in_img[i][j] - mean; 
      var += tmp * tmp; 
     } 
    } 
    var = Math.sqrt(var/(size)); 
    System.out.println("Variance = " + var); 

    max = maxgray = 0; 
    for (i = 0; i < N; i++) { 
     if (max < hist[i]) { 
      max = (int) hist[i]; 
      maxgray = i; 
     } 
    } 
    System.out.println("Max count " + max + " (graylevel = " + maxgray 
      + ")"); 

    // Normalize to M for better display effect 
    norm = (double) M/maxgray; 
    System.out.println("Norm = " + norm); 

    out_img = new int[nrows][ncols]; 
    for (int x = 0; x < in_img.length; x++) { 
     for (int y = 0; y < in_img[0].length; y++) { 
      out_img[x][y] = (int) (in_img[x][y] * norm); 
     } 
    } 
    normalize = ImageUtils.CreateImagefromIntArray(out_img); 

    writeImage(f2); 
} 

private static void writeImage(String output) throws IOException { 
    File file = new File(output + ".jpg"); 
    ImageIO.write(normalize, "jpg", file); 
} 
} 

link과 같은 정규화. 그러나 나는 원하는 결과를 얻지 못하고있다. 누구든지 나를 도울 수 있을까?

+0

충분한 담당자가 있어야합니다. SO가 코드 팩토리가 아니며 모호한 질문이 아님을 알기 위해 -1 –

+2

SO가 사람이 운영하는 google.com이 아닙니다. –

+0

@AndrewThompson 질문을 업데이트했습니다. –

답변

2

따라서이 필터를 수행하기 위해 히스토그램을 사용할 필요가 없습니다.

// Parameters to ImageNormalization 
float mean = 160; 
float variance = 150; 

int width = fastBitmap.getWidth(); 
int height = fastBitmap.getHeight(); 

float globalMean = Mean(fastBitmap); 
float globalVariance = Variance(fastBitmap, globalMean); 

for (int i = 0; i < height; i++) { 
    for (int j = 0; j < width; j++) { 

     int g = fastBitmap.getGray(i, j); 
     float common = (float)Math.sqrt((variance * (float)Math.pow(g - globalMean, 2))/globalVariance); 
     int n = 0; 
     if (g > globalMean){ 
      n = (int)(mean + common); 
     } 
     else{ 
      n = (int)(mean - common); 
     } 

     n = n > 255 ? 255 : n; 
     n = n < 0 ? 0 : n; 

     fastBitmap.setGray(i, j, n); 
    } 
} 

private float Mean(FastBitmap fb){ 
    int height = fb.getHeight(); 
    int width = fb.getWidth(); 

    float mean = 0; 
    for (int i = 0; i < height; i++) { 
     for (int j = 0; j < width; j++) { 
      mean += fastBitmap.getGray(i, j); 
     } 
    } 
    return mean/(width * height); 
} 

private float Variance(FastBitmap fb, float mean){ 
    int height = fb.getHeight(); 
    int width = fb.getWidth(); 

    float sum = 0; 
    for (int i = 0; i < height; i++) { 
     for (int j = 0; j < width; j++) { 
      sum += Math.pow(fastBitmap.getGray(i, j) - mean, 2); 
     } 
    } 
    return sum/(float)((width * height) - 1); 
} 
+0

ImageStatistics에서 평균 및 분산이 필요한 경우 말해주십시오. :) –

+0

내가했던 것처럼 당신은 평균과 vairiance를 계산 했습니까? 그렇지 않다면 당신의 접근 방식은 무엇입니까? –

+0

당신의 평균 코드를 보았습니다. 그것은 내가 한 것과 동일합니다. globalVariance는 어떻게 계산하고 있습니까? –

1

여기서, 이미지 정규화를 수행하는 자바 프로젝트 코드 포함 http://www.developer.com/java/other/article.php/3441391/Processing-Image-Pixels-Using-Java-Controlling-Contrast-and-Brightness.htm

이미지 작업, 사용되는 용어는 (루트 평균 자승) 대비 및 밝기 대신 분산 및 평균. (사용하는 명암의 종류를 지정하십시오.)

이 페이지의 정보는 히스토그램 균등화에 관한 것입니다. 위키 피 디아에 http://answers.opencv.org/question/6364/fingerprint-matching-in-mobile-devices-android/

정보 : http://en.wikipedia.org/wiki/Histogram_equalization#Implementationhint

1

내가 다음 버전 (1.2)에 Catalano Framework를 사용하는이 문서 Fingerprint Recognition Using Zernike Moments

시도에 사용 된 이미지 표준화를 구현하는 당신을 도울 수, 나는에 이미지 정상화를 코딩 할 수 있습니다 프레임 워크.

Zernike Moments는 Hu Moments와 마찬가지로 준비가되어 있습니다.이 기사를 원한다면.

+0

안녕하세요, 정규화 코드를 업데이트했습니다. 링크에서 원하는 결과를 얻는 데 도움을 줄 수 있습니까? –

+0

물론이 링크와 같은 결과가 나타납니다. 이번 달에 Catalano Framework v1.2를 설치하겠습니다. 오늘 밤에 코드를 확인해 보겠습니다. –