полутоновое изображение в матрицу и матричное в полутоновое изображение - PullRequest
0 голосов
/ 18 октября 2018

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

Но при попытке преобразовать изображение в матрицу пиксели возвращаются сзначения черного.

Как найти решение для этой проблемы?

Вы можете найти изображения под кодом

Код Java:

public class MyImageProcessing {
    private SampleModel sampleModel;
    public int[][] compute(File file)
{
try 
{
    BufferedImage img= ImageIO.read(file);
    Raster raster=img.getData();
    sampleModel = raster.getSampleModel();
    int w=raster.getWidth(),h=raster.getHeight();
    int pixels[][]=new int[w][h];
    for (int x=0;x<w;x++)
    {
        for(int y=0;y<h;y++)
        {
            pixels[x][y]=raster.getSample(x,y,0);
        }
    }

    return pixels;

}
catch (Exception e)
{
    e.printStackTrace();
}
return null;
}


    public void getImage(int pixels[][])
{
     int w=pixels.length;
     int h=pixels[0].length;
      WritableRaster raster= Raster.createWritableRaster(sampleModel, new Point(0,0));
     for(int i=0;i<w;i++)
     {
         for(int j=0;j<h;j++)
         {
             raster.setSample(i,j,0,pixels[i][j]);
         }
     }
BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY);
image.setData(raster);
File output=new File("C:\\Users\\salam\\Pictures\\3.png");
try {
    ImageIO.write(image,"png",output);
}
catch (Exception e)
{
    e.printStackTrace();
}
}

}

Исходное изображение:

original image

Изображение получено из матрицы:

image retrieved from matrix

1 Ответ

0 голосов
/ 18 октября 2018

Попробуйте этот код.

Если это не то, что вам нужно, то, возможно, вы могли бы отнять у меня пост, что код всегда должен быть аккуратным, читаемый, с правильными отступами и комментариями, все это повышает понятность программы.

Примечание: Ваше изображение возвращает практически одно и то же черно-белое изображение при преобразовании в оттенки серого, посколькуваше изображение черно-белое, очень похоже на двоичное изображение.

Я также могу предложить OpenCV (https://opencv.org/), который находится под лицензией BSD, он простой, мощный и доступныйдля Java - хотя я помню, что это был PITA при установке его в Ubuntu 16.04.

import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

/**
 * This class converts images to grayscale color.
 */

public class GrayscaleConverter {

/**
 * Creates a new grayscaled BufferedImage object from the given source image
 * by averaging each pixels RGB value.
 * 
 * @param inputImageAbsPath the absolute path of the image file, including its name and extension.
 * @return a BufferedImage object.
 */
private BufferedImage compute(String inputImageAbsPath) {

    System.out.println("... Converting source image to gray scale.");

    BufferedImage img = null; // image file

    // Read the source image or throw an exception
    try {
        img = ImageIO.read(new File(inputImageAbsPath));
    } catch(Exception e) {
        e.printStackTrace();
    }

    // Get the image width and height dimensions
    int width = img.getWidth();
    int height = img.getHeight();

    // Convert to grayscale by looping over pixels, beginning at top-most left coordinate (0,0)
    for (int y = 0; y < height; y++) { // y = rows
        for (int x = 0; x < width; x++) { // x = columns

            // Get the pixel value at this (x,y) coordinate
            int p = img.getRGB(x,y);

            // Extract the alpha, R, G, B values from pixel p
            int a = (p>>24) & 0xff; // Shift bits and unsign
            int r = (p>>16) & 0xff;
            int g = (p>>8) & 0xff;
            int b = p & 0xff;

            // Calculate average color (grayscale it)
            int avg = (r+g+b)/3;

            // Replace RGB value with avg
            p = (a<<24) | (avg<<16) | (avg<<8) | avg;
            img.setRGB(x, y, p);
        }
    }
    return img;
}

/**
 * Saves the converted grayscale image. This method builds the save path from the provided file name,
 * file extension, and absolute path of the folder that you want to save the image in.
 * 
 * @param path the absolute path of the folder that you would like to save the image inside.
 * @param imageName the name you would like to save the image with.
 * @param imageFileType the image file extension, without the dot (.) preceding the image file type.
 * @param image the BufferedImage object returned from the compute method.
 */
private void saveImage(String path, String imageName, String imageFileType, BufferedImage image) {

    // Save or throw exception
    try {
        System.out.println("... Saving grayscale image to "
                + path.concat("\\").concat(imageName).concat(".").concat(imageFileType)); // save path displayed to user

        ImageIO.write(image,
                    imageFileType,
                    new File(path.concat("\\").concat(imageName).concat(".").concat(imageFileType)));

    } catch(Exception e) {
        e.printStackTrace();
    }
    System.out.println("... Image saved.");
}


// Driver
public static void main(String args[]) throws IOException {

    /*
     * Tested for .png and .jpg files. Both worked successfully.
     */

    // Test
    System.out.println("Testing GrayscaleConverter.\n");

    String input = "*source images absolute file path including name and extension*";
    String outputPath = "*absolute path to folder where you will save grayscale image in*";
    String outputFileName = "*save image with this name*";
    String outputFileType = "*save image with this file extension (no dot (.) e.g. png or jpg)*";

    GrayscaleConverter gsc = new GrayscaleConverter();
    BufferedImage convertedImage = gsc.compute(input);
    gsc.saveImage(outputPath, outputFileName, outputFileType, convertedImage );

    System.out.println("\nTest complete.");
}

}

Ваше входящее изображение: enter image description here

Ваше выходное изображение: enter image description here

Другой пример входного изображения: enter image description here

Другой пример выходного изображения: enter image description here

Я проверил свой программ с файлами изображений .png и .jpg, и это сработало.Удачи.

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