Rozmycie Gaussa

0

Jak wykonać rozmycie Gaussa dla pewnego fragmentu obrazu ? Chce rozmyć prostokątny wycinek w środku obrazka - na pełnej szerokości - ale w takiej formie, żeby nie wyglądało jak wklejony, rozmazany fragment innego obrazka, ale przechodziło z jakimś gradientem - płynnie. Tak, jakby ktoś tracił ostrość tylko w pasku na środku obrazka. Musi być koniecznie w Javie - rozmycie Gaussa zrobić potrafię, ale nie dla fragmentu obrazka w taki sposób, żeby nie było widać nagłego przejścia między fragmentem ostrym, a rozmytym.

0

Jak dalej widać ostre przejście to zwiększ rozmiar macierzy filtru.


Opolski Portal Programistyczny
http://programowanie.opole.pl

0

Zastosowałem poniższy algorytm:

 
public static ConvolveOp getGaussianBlurFilter(int radius,
            boolean horizontal) {
        if (radius < 1) {
            throw new IllegalArgumentException("Radius must be >= 1");
        }
        
        int size = radius * 2 + 1;
        float[] data = new float[size];
        
        float sigma = radius / 3.0f;
        float twoSigmaSquare = 2.0f * sigma * sigma;
        float sigmaRoot = (float) Math.sqrt(twoSigmaSquare * Math.PI);
        float total = 0.0f;
        
        for (int i = -radius; i <= radius; i++) {
            float distance = i * i;
            int index = i + radius;
            data[index] = (float) Math.exp(-distance / twoSigmaSquare) / sigmaRoot;
            total += data[index];
        }
        
        for (int i = 0; i < data.length; i++) {
            data[i] /= total;
        }        
        
        Kernel kernel = null;
        if (horizontal) {
            kernel = new Kernel(size, 1, data);
        } else {
            kernel = new Kernel(1, size, data);
        }
        return new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
    }

Co konkretnie w tym można zmienić ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1