Попробую писать монохромный противотуманный фильтр - PullRequest
0 голосов
/ 12 февраля 2012

Мое задание - написать монохромный (черно-белый) противотуманный фильтр, чтобы изменить изображение так, чтобы оно выглядело так, как будто оно было снято в туманный день. Для этого измените каждое значение на изображении на среднее значение самого значения, значения рядом с ним (4 или все 8) и случайное значение от 0 до 255 ((short)(Math.random() * 256) получат случайное число). Мой учитель не отвечает по выходным за помощью.

Так вот, где я нахожусь: Я улучшил свой код, потому что он делает изображение черно-белым. Но я думал, что это будет выделяться больше, чем черно-белое. Я просто хочу удостовериться, что я, по крайней мере, делаю то, что просил.

Учитель разработал несколько своих классов для этого задания и Интерфейс

Класс ImageProvider , который предоставляет изображение (изображение в формате .jpg) java.lang.Object продлен byjava.awt.Component расширенный byimagelab.ImgProvider

Все реализованные интерфейсы: java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable

Класс ImageLab java.lang.Object расширенный byimagelab. ImageLab

ImageLab - это платформа для разработки фильтров изображений. ImageLab начинается с создания меню всех доступных фильтров (те файлы .class, которые реализуют интерфейс ImageFilter @see ImageFilter).

Интерфейс ImageFilter

открытый интерфейс ImageFilter

Интерфейс ImageFilter реализован соответствующими фильтрами изображений.

Детали реализации Формат программы При написании фильтра вы должны указать, что фильтр является членом пакета фильтра, поместив строку: пакетные фильтры; в верхней части файла .java.

Чтобы ваш фильтр мог найти интерфейс ImageFilter, вы должны поставить строку: импортировать imagelab. *; как вторая строка в файле.

Чтобы скомпилировать ваш фильтр (предположим, он называется MyFilter.java), перейдите в родительский каталог (каталог, в котором есть imagelab и фильтры в качестве подкаталогов) и введите: javac filters / MyFilter.java

Чтобы запустить imageLab, вы должны быть в том же каталоге и набрать: imagelab Java.ImageLab

package filters;
import imagelab.*;

public class Monochrome implements ImageFilter {

    ImgProvider filteredImage;

public void filter (ImgProvider ip) {

    short[][] mono = ip.getBWImage();//Convert the picture to B&W

    short[][] mono2 = new short[mono.length][mono[0].length];

    /**Go through both arrays and change every value in the image to the average of the value itself, the values next to it (4 or all 8) and a random value from 0 to 255
    */
    for (int r = 1; r<mono.length-1; r++) {
        for (int c = 1; c < mono[0].length-1; c++) { 
            int val = mono[r][c];
            val += ((short)Math.random()*256); //random number
            val += mono[r-1][c];
            val += mono[r+1][c]; 
            val += mono[r][c-1];
            val += mono[r][c+1];
            val /= 5;
            val = (val < 0) ? -val : val;
            if (val > 255) val = 255;
            mono2[r][c] = (short)((val < 0) ? -val : val);      
        }//for c
    }//for r;

    filteredImage = new ImgProvider(); //create the new .jpg image 
    filteredImage.setBWImage(mono2); //set it to B&W using the monochrome settings
    filteredImage.showPix("Monochrome of original image"); //label the image
}//filter

public ImgProvider getImgProvider() {
    return filteredImage;
}//getImgProvider

public String getMenuLabel() {
    return "Monochrome";
} //getMenuLabel

}

1 Ответ

0 голосов
/ 12 февраля 2012

Вы заявляете, что вам нужно "change every value in the image to the average of the value itself, the values next to it (4 or all 8) and a random value from 0 to 255"

В настоящее время вы не делаете ничего подобного; вы назначаете случайным образом выбранное местоположение для вашего текущего местоположения, проходя через массивы.

Ваши 2 цикла для прохождения всего 2D-массива в порядке, но вам нужно получить значения тех, которые окружают тот, в котором вы находитесь в данный момент.

Пример: если вы на mono[0][0], вам нужно получить mono[0][1], mono[1][0] и mono[1][1]. Добавьте их вместе со значением вашего текущего местоположения и случайным числом, а затем разделите на 5, чтобы получить среднее значение.

Вы заметите, что я выбрал угол для примера. В зависимости от того, где вы находитесь в 2D-массиве, вы можете иметь 3 (вы находитесь в углу), 5 (вы находитесь на границе, но не в углу) или 8 (вы находитесь внутри) окружающих значений; Я не знаю, откуда взялась 4 в вашем описании.

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