3

画像のヒストグラム均等化を行っています。最初にRGB画像を取得し、それをYUVに変換します。YUVのY'でヒストグラム均等化アルゴリズムを実行してから、RGBに変換し直します。それは私ですか、それとも画像が奇妙に見えますか?私はこれを正しくやっていますか?この画像はかなり明るく、他の画像は少し赤です。

前後の画像は次のとおりです。

前 後

アルゴリズム(コメントされた値は、以前に変換に使用した値です。どちらもほぼ同じ結果になります):

    public static void createContrast(Bitmap src) {

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

    Bitmap processedImage = Bitmap.createBitmap(width, height, src.getConfig());

    int A = 0,R,G,B;
    int pixel;
    float[][] Y = new float[width][height];
    float[][] U = new float[width][height];
    float[][] V = new float [width][height];
    int [] histogram = new int[256];
    Arrays.fill(histogram, 0);

    int [] cdf = new int[256];
    Arrays.fill(cdf, 0);
    float min = 257;
    float max = 0;

    for(int x = 0; x < width; ++x) {
        for(int y = 0; y < height; ++y) {
            pixel = src.getPixel(x, y);
            //Log.i("TEST","("+x+","+y+")");
            A = Color.alpha(pixel);
            R = Color.red(pixel);
            G = Color.green(pixel);
            B = Color.blue(pixel);

            /*Log.i("TESTEST","R: "+R);
            Log.i("TESTEST","G: "+G);
            Log.i("TESTEST","B: "+B);*/

            // convert to YUV
            /*Y[x][y] = 0.299f * R + 0.587f * G + 0.114f * B;
            U[x][y] = 0.492f * (B-Y[x][y]);
            V[x][y] = 0.877f * (R-Y[x][y]);*/

            Y[x][y] = 0.299f * R + 0.587f * G + 0.114f * B;
            U[x][y] = 0.565f * (B-Y[x][y]);
            V[x][y] = 0.713f * (R-Y[x][y]);
            // create a histogram
            histogram[(int) Y[x][y]]+=1;
            // get min and max values
            if (Y[x][y] < min){
                min = Y[x][y];
            }
            if (Y[x][y] > max){
                max = Y[x][y];
            }
        }
    }

    cdf[0] = histogram[0];
    for (int i=1;i<=255;i++){
        cdf[i] = cdf[i-1] + histogram[i];
        //Log.i("TESTEST","cdf of: "+i+" = "+cdf[i]);
    }

    float minCDF = cdf[(int)min];
    float denominator = width*height - minCDF;
    //Log.i("TEST","Histeq Histeq Histeq Histeq Histeq Histeq");
    for(int x = 0; x < width; ++x) {
        for(int y = 0; y < height; ++y) {
            //Log.i("TEST","("+x+","+y+")");
            pixel = src.getPixel(x, y);
            A = Color.alpha(pixel);
            Y[x][y] = ((cdf[ (int) Y[x][y]] - minCDF)/(denominator)) * 255;
            /*R = minMaxCalc(Y[x][y] + 1.140f * V[x][y]);
            G = minMaxCalc (Y[x][y] - 0.395f * U[x][y] - 0.581f * V[x][y]);
            B = minMaxCalc (Y[x][y] + 2.032f * U[x][y]);*/

            R = minMaxCalc(Y[x][y] + 1.140f * V[x][y]);
            G = minMaxCalc (Y[x][y] - 0.344f * U[x][y] - 0.714f * V[x][y]);
            B = minMaxCalc (Y[x][y] + 1.77f * U[x][y]);
            //Log.i("TESTEST","A: "+A);
            /*Log.i("TESTEST","R: "+R);
            Log.i("TESTEST","G: "+G);
            Log.i("TESTEST","B: "+B);*/
            processedImage.setPixel(x, y, Color.argb(A, R, G, B));
        }
    }

}

次のステップは、前後のヒストグラムをグラフ化することです。ここで意見を聞きたいだけです。

4

1 に答える 1