2

私のアプリでは、明るさ、コントラストなどの画像を編集したいのですが、いくつかのチュートリアルがあり、コントラストを変更しようとしています

public static Bitmap createContrast(Bitmap src, double value) {
        // image size
        int width = src.getWidth();
        int height = src.getHeight();
        // create output bitmap
        Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
        // color information
        int A, R, G, B;
        int pixel;
        // get contrast value
        double contrast = Math.pow((100 + value) / 100, 2);

        // scan through all pixels
        for(int x = 0; x < width; ++x) {
            for(int y = 0; y < height; ++y) {
                // get pixel color
                pixel = src.getPixel(x, y);
                A = Color.alpha(pixel);
                // apply filter contrast for every channel R, G, B
                R = Color.red(pixel);
                R = (int)(((((R / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
                if(R < 0) { R = 0; }
                else if(R > 255) { R = 255; }

                G = Color.red(pixel);
                G = (int)(((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
                if(G < 0) { G = 0; }
                else if(G > 255) { G = 255; }

                B = Color.red(pixel);
                B = (int)(((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
                if(B < 0) { B = 0; }
                else if(B > 255) { B = 255; }

                // set new pixel color to output bitmap
                bmOut.setPixel(x, y, Color.argb(A, R, G, B));

            }
        }


        // return final image
        return bmOut;

それを次のように呼び出します:

ImageView image = (ImageView)(findViewById(R.id.image));
        //image.setImageBitmap(createContrast(bitmap));

しかし、画像に問題が発生しているとは思いません。私が間違っているところを助けてください。

APi 14 の effectFactory を見ました。画像処理の古いバージョンに使用できる同様の/チュートリアルはありますか

4

1 に答える 1

0

このアプローチには 3 つの基本的な問題があります。最初の 2 つはコーディングの問題です。まず、常に を呼び出しており、コードにはandColor.redがありません。2 番目の問題は、この計算が反復的すぎることです。色が [0, 255] の範囲にあると想定しているため、[0, 255] でそれぞれに対して計算されたコントラストを使用して 256 の位置の配列を作成する方がはるかに高速です。Color.greenColor.bluei

3 番目の問題は、より問題です。コントラストを改善するためにこのアルゴリズムを検討したのはなぜですか? 結果は RGB では意味がありません。別のカラー システムでより良い結果が得られる可能性があります。パラメータvalueを 0、10、20、および 30 に設定した場合の結果は次のとおりです。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

この操作を実行するための Python コードの例を次に示します。

import sys
from PIL import Image

img = Image.open(sys.argv[1])
width, height = img.size

cvalue = float(sys.argv[2]) # Your parameter "value".
contrast = ((100 + cvalue) / 100) ** 2

def apply_contrast(c):
    c = (((c / 255.) - 0.5) * contrast + 0.5) * 255.0
    return min(255, max(0, int(c)))

# Build the lookup table.
ltu = []
for i in range(256):
    ltu.append(apply_contrast(i))

# The following "point" method applies a function to each
# value in the image. It considers the image as a flat sequence
# of values.
img = img.point(lambda x: ltu[x])

img.save(sys.argv[3])
于 2012-12-21T13:59:20.117 に答える