Domanda

Sto cercando di implementare MATLAB rgb2gray in Java secondo http://www.mathworks.com/help/toolbox/images/ref/rgb2gray.html . Ho il codice seguente:

public BufferedImage convert(BufferedImage bi){
    int heightLimit = bi.getHeight();
    int widthLimit = bi.getWidth();
    BufferedImage converted = new BufferedImage(widthLimit, heightLimit,
        BufferedImage.TYPE_BYTE_GRAY);

    for(int height = 0; height < heightLimit; height++){
        for(int width = 0; width < widthLimit; width++){
            // Remove the alpha component
            Color c = new Color(bi.getRGB(width, height) & 0x00ffffff);
            // Normalize
            int newRed = (int) 0.2989f * c.getRed();
            int newGreen = (int) 0.5870f * c.getGreen();
            int newBlue = (int) 0.1140f * c.getBlue();
            int roOffset = newRed + newGreen + newBlue;
            converted.setRGB(width, height, roOffset);
        }
    }

    return converted;
}

Ora, ottengo un'immagine in scala di grigi ma è troppo buio rispetto a quello che ottengo da Matlab. Afaik, il modo più semplice per trasformare un'immagine in scala di grigi è avere un bufferedimage di tipo type_byte_gray e quindi copiare i pixel di un bufferedimage di type_int_ (a) rgb. Ma anche questo metodo fornisce un'immagine più scura di quella di Matlab, sebbene Grayscale abbastanza decentemente. Ho anche cercato di usare RescaleOp. Tuttavia, non trovo comunque in Resaliop per impostare il grigio per pixel.

Come test aggiunto, ho stampato le matrici dell'immagine prodotte da Java NAD da Matlab. In Java, ottengo cifre come 6316128 6250335 6118749 6118749 6250335 6447714 Mentre in Matlab, ottengo solo qualcosa come 116 117 119 120 119 115 (prime sei cifre di entrambe le matrici).

Come ottengo un output simile a quello di Matlab?

È stato utile?

Soluzione

Il Precedenza dell'operatore in Java Specifica che il fascio di tipo è superiore alla moltiplicazione. Stai lanciando le tue costanti a punto mobile a 0, quindi non capisco come stai ottenendo un risultato in scala di grigi. Facile da correggere:

        int newRed = (int) (0.2989f * c.getRed());
        int newGreen = (int) (0.5870f * c.getGreen());
        int newBlue = (int) (0.1140f * c.getBlue());

Sostituirei anche 0.2989 insieme a 0.2990 come sembra essere un errore di battitura nella documentazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top