Реализация создания модифицированного эскиза в Java - PullRequest
1 голос
/ 08 февраля 2011

Я на последнем курсе Engg.я хочу реализовать алгоритм генерации эскизов с небольшой модификацией для моего проекта на последнем году. Для этого я хочу получить доступ и изменить значения интенсивности пикселей (не с точки зрения RGB, а с точки зрениячисловое число, представленное в Matlab). Хотя алгоритм отлично работает в Matlab, но из-за требований проекта я собираюсь сделать это на Java.Мне не помогло посещение интернета и различных форумов Java.
Код Matlab позволяет мне получить доступ к пикселю, используя следующие фрагменты
Значение интенсивности пикселя в 120 234 задается как «A (120 234)», где A - это имярассматриваемое изображение.
Точно так же я хотел бы получить доступ к значениям интенсивности пикселей изображения в Java и изменить их с помощью алгоритма.
Я был бы очень рад, если бы кто-то помог мне.
Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Поскольку у вас есть доступ к matlab, я бы посоветовал покопаться в их коде, предположив, что их изображения написаны на Matlab, что, как мне кажется, и посмотреть, как они преобразуют RGB в интенсивность. Они используют HSL (Hue-Saturation-Luminance)? Или какое-то другое преобразование цветов. Зная это, вы можете найти Java-код для преобразования, например, RGB в HSL.

Edit:
Что касается комментариев по этому вопросу, я думаю, что этот код будет работать. Он не завершен, поскольку я не копировал и не переписывал все манипуляции, но он должен дать вам идею.

    import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Convolution {
    public static void main( String[] args ) throws Exception {
        File inputFile = new File("apple.jpg");
        BufferedImage bufferedImage = ImageIO.read(inputFile);
        int w = bufferedImage.getWidth();
        int h = bufferedImage.getHeight();

        System.out.println("w=" + w + ", h=" + h);

        // Get Pixels
        int[] image = new int[w * h];
        bufferedImage.getRGB(0, 0, w, h, image, 0, w);

        // Convert to simple grayscale
        for ( int y = 0; y < h; y++ ) {
            for ( int x = 0; x < w; x++ ) {
                int idx = ( y * w ) + x;
                int p = image[idx];
                int r = p & 0x00FF0000 >> 16;
                int g = p & 0x0000FF >> 8;
                int b = p & 0x000000FF;
                image[idx] = (int) ( ( r + g + b ) / 3.0 );
            }
        }

        int convolutionSize = 3;
        int[][] convolution = { { 0, -1, 0 }, { -1, 4, -1 }, { 0, -1, 0 } };

        int[] newImage = new int[w * h];
        // Apply the convolution to the whole image, note that we start at
        // 1 instead 0 zero to avoid out-of-bounds access
        for ( int y = 1; y + 1 < h; y++ ) {
            for ( int x = 1; x + 1 < w; x++ ) {
                int idx = ( y * w ) + x;

                // Apply the convolution
                for ( int cy = 0; cy < convolutionSize; cy++ ) {
                    for ( int cx = 0; cx < convolutionSize; cx++ ) {
                        int cIdx = ( ( ( y - 1 ) + cy ) * w )
                                + ( ( x - 1 ) + cx );
                        newImage[idx] += convolution[cy][cx] * image[cIdx];
                    }
                }

                // pixel value rounding
                if ( newImage[idx] < 0 ) {
                    newImage[idx] = -newImage[idx];
                } else {
                    newImage[idx] = 0;
                }
                if ( newImage[idx] > 0 ) {
                    newImage[idx] = 120 - newImage[idx];
                } else {
                    newImage[idx] = 255;
                }

            }
        }

        // Convert to "proper" grayscale
        for ( int y = 0; y < h; y++ ) {
            for ( int x = 0; x < w; x++ ) {
                int idx = ( y * w ) + x;
                int p = newImage[idx];
                newImage[idx] = 0xFF000000 | ( p << 16 ) | ( p << 8 ) | p;
            }
        }

        // Set the image to have the new values;
        bufferedImage.setRGB(0, 0, w, h, newImage, 0, w);

        // Write the new image as a PNG to avoid lossey compression,
        // and its eaiser than trying to display an image in Java.
        ImageIO.write(bufferedImage, "png", new File("new_apple.png"));
    }
}

Edit:
Изменен код для работы, как ожидалось. Это не быстро, но работает.
До:
Before

После того, как:
After

0 голосов
/ 08 февраля 2011

Мне кажется, что вы хотите использовать bufferedImage , из которого вы можете получить writableRaster , который вы можете использовать для чтения / записи значений пикселей.

См. Также этот учебник о нескольких способах взаимодействия с bufferedImage.

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