Фильтр Java ImageIO Mean - PullRequest
       1

Фильтр Java ImageIO Mean

1 голос
/ 02 февраля 2012

В настоящее время я пытаюсь написать программу, в которой применяется средний фильтр по вводу пользователя, определяющий размер окрестности и тип файла. Моя программа соответствует и запускается, но полученное изображение, которое я получаю, не близко к тому, что было вставлено. Я не уверен, что это чтение, которое выбрасывает его, или вывод, или, может быть, даже математика, но мои изображения в итоге оказываются отмечая, но большое изображение соли и перца. Вот мой код, так как сейчас я применяю средний фильтр 3х3, чтобы он работал правильно

img = ImageIO.read(new File(fileName));

//get dimensions
maxHeight = img.getHeight();
maxWidth = img.getWidth();

//create 2D Array for new picture
int pictureFile[][] = new int [maxHeight][maxWidth];
for( int i = 0; i < maxHeight; i++ ){
    for( int j = 0; j < maxWidth; j++ ){
        pictureFile[i][j] = img.getRGB( j, i );
    }
}

//Apply Mean Filter
for (int v=1; v<=maxHeight-2; v++) {
    for (int u=1; u<=maxWidth-2; u++) {
        //compute filter result for position (u,v)

        int sum = 0;
        for (int j=-1; j<=1; j++) {
            for (int i=-1; i<=1; i++) {
                int p = pictureFile[u+i][v+j];
                sum = sum + p;

            }
        }

        int q = (int) (sum / 9);
        pictureFile[u][v] = q;
    }
}

//Turn the 2D array back into an image
BufferedImage theImage = new BufferedImage(
    maxHeight, 
    maxWidth, 
    BufferedImage.TYPE_BYTE_GRAY);
int value;
for(int y = 0; y<maxHeight; y++){
    for(int x = 0; x<maxWidth; x++){

        value = pictureFile[y][x] ;
        theImage.setRGB(x, y, value);
    }
}

File outputfile = new File("saved.png");
ImageIO.write(theImage, "png", outputfile);

1 Ответ

2 голосов
/ 02 февраля 2012

Не имеет смысла применять арифметические операции к значениям ARGB, упакованным в int s, как возвращено getRGB().

Поскольку вы хотите, чтобы ваш вывод был в градациях серого, вам необходимо преобразовать значениявозвращается getRGB() в градациях серого, примените фильтр к этим значениям градаций серого, а затем преобразуйте их обратно в ARGB для передачи их в setRGB().

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...