Странный вывод при обработке изображений с помощью обработки 3.3.7 - PullRequest
0 голосов
/ 22 октября 2018

Что у меня есть:

У меня есть 2 изображения одинакового размера (500), одно из них является обычным, а у другого есть сообщение только с черными пикселями (сообщение) и белых пикселей (ничего).

Что я делаю в encodeImage(), так это создаю messageEncoded с пикселями originalImage и увеличиваем его на 1, если пиксель messageImage отсутствуетt white.

Вот как я скрываю изображение в другом изображении, поэтому decodeImage() должен прочитать originalImage и messageEncoded, чтобы извлечь messageImage, создав messageDecoded с белым пикселемкогда не меняется пиксель и черный, и он меняется.

PImage originalImage;      
PImage messageImage; 
PImage messageEncoded;
PImage messageDecoded;

void setup() {
  size(500, 500);

  originalImage = loadImage("jap.jpg");  
  messageImage = loadImage("msg.jpg");  

  messageEncoded = createImage(originalImage.width, originalImage.height, RGB);
  messageDecoded = createImage(originalImage.width, originalImage.height, RGB);

  encodeImage();
}

void decodeImage() {

  originalImage.loadPixels();
  messageEncoded.loadPixels();
  messageDecoded.loadPixels();

  PImage msg = loadImage("messageEncoded.jpg");
  msg.loadPixels();

  for (int x = 0; x < originalImage.width; x++) {
    for (int y = 0; y < originalImage.height; y++ ) {
      int loc = x + y * originalImage.width;

      if (messageEncoded.pixels[loc] == originalImage.pixels[loc]) {
        messageDecoded.pixels[loc] = color(255);
      } else {
        messageDecoded.pixels[loc] = color(0);
      }
    }   
  }

  messageDecoded.updatePixels();
  messageDecoded.save("messageDecoded.jpg");
  image(messageDecoded, 0, 0);

}

void encodeImage() {  
  originalImage.loadPixels();
  messageImage.loadPixels();
  messageEncoded.loadPixels();

  for (int x = 0; x < originalImage.width; x++) {
    for (int y = 0; y < originalImage.height; y++ ) {
      int loc = x + y * originalImage.width;

      if (messageImage.pixels[loc] != color(255)) {
        float r = red(originalImage.pixels[loc]);
        float g = green(originalImage.pixels[loc]);
        float b = blue(originalImage.pixels[loc]);
        messageEncoded.pixels[loc] = color(r + 1, g + 1, b + 1);
      } else {
        messageEncoded.pixels[loc] = originalImage.pixels[loc];
      }

    }
  }

  messageEncoded.updatePixels();
  messageEncoded.save("messageEncoded.jpg");
  //image(messageEncoded, 0, 0);


  decodeImage();
}

Проблемы:

  1. У меня есть переменная PImage msg в void decodeImage(), которую яне использую.Эта переменная должна быть такой же, как глобальная messageEncoded, потому что она читает файл, который только что выдал, но если я использую msg, меняю

        if (messageEncoded.pixels[loc] == originalImage.pixels[loc]) {
                messageDecoded.pixels[loc] = color(255);
              } else {
                messageDecoded.pixels[loc] = color(0);
              }
    

    на

        if (msg.pixels[loc] == originalImage.pixels[loc]) {
                messageDecoded.pixels[loc] = color(255);
              } else {
                messageDecoded.pixels[loc] = color(0);
              }
    

    результат совершенно другой и странный.Зачем?Какая разница между messageEncoded и msg?

  2. messageDecoded немного не так, почему у него неправильные черные точки?
    • Я сделал messageImage в краске, так что я, хотя краска создает не черные точки, но я смотрю все пиксели, даже помещаю один черный пиксель и по-прежнему появляется несколько черных точек вокруг него.

  • originalImage.Я нашел это в Google, набрав «500x500 изображений».originalImage
  • messageImage.Я создал это на рисовании и сохранил его с размерами 500x500 (для тестирования можно и рисовать только черным цветом и пикселями). messageImage
  • Очень странная картина, которая возникает, когда яиспользуйте msg.(Задача 1) msg
  • messageDecoded имеют черные точки вокруг него.Могу ли я назвать это шумом?(Проблема 2) messageDecoded

Редактировать 1:

Странное изображение и проблема 1 решаются, когда я использую изображения в формате PNG, но проблема 2«шум» еще не исправлен

1 Ответ

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

Вероятно, проблема связана с кодированием JPEG (шум выглядит характерно для артефактов сжатия).Вам нужно будет работать с изображениями в формате без потерь, например .PNG , чтобы решить эту проблему.

  • Восстановить messageImage, сохранив его как .PNG на этот раз.

  • Преобразуйте originalImage в .PNG и измените свой код так, чтобы при обработке изображения сохранялись как .PNG .

    * 1020.*

Можно использовать JPEG в качестве исходного изображения;проблема возникает из-за последовательного сохранения / кодирования JPEG (когда изменяется больше пикселей, чем просто кодируемых).

...