使用 Processing 3.3.7 处理图像时出现奇怪的输出

Weird output while processing images with Processing 3.3.7

我有:

我有 2 张相同大小 (500) 的图片,一张是普通图片,另一张有一条消息,只有 黑色像素 (消息)和 白色像素(无)。

我在 encodeImage() 中所做的是使用 originalImage 的像素创建 messageEncoded,如果 messageImage 的像素不是白色,则将其递增 1。

这就是我在另一个图像中隐藏图像的方式,所以 decodeImage() 应该读取 originalImagemessageEncoded 来提取 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. 我在 void decodeImage() 中有我没有使用的变量 PImage msg。这个变量应该和全局 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);
              }
    

    结果完全不同而且很奇怪。为什么? messageEncodedmsg有什么区别?

  2. messageDecoded有点不对,为什么会出现这个不对的黑点?
    • 我在绘画中制作了 messageImage,所以我虽然绘画正在创建非黑点,但我查看了所有像素,甚至放了一个黑色像素,但周围仍然出现了一些黑点。

编辑 1:

使用PNG图片时出现的奇怪图片和问题1已经解决,但是"noise"的问题2还没有解决

问题很可能是 JPEG 编码引起的(噪声看起来是压缩伪像的特征)。您需要使用 .PNG 等无损格式的图像来缓解此问题。

  • 重新创建 messageImage,这次将其另存为 .PNG

  • originalImage 转换为 .PNG 并修改您的代码,使 处理将图像保存为 .PNG.

可以使用JPEG作为源图片;问题来自连续的 JPEG saving/encoding(其中更改的像素多于正在编码的像素)。