【问题标题】:Weird output while processing images with Processing 3.3.7使用 Processing 3.3.7 处理图像时出现奇怪的输出
【发布时间】:2018-10-22 02:00:41
【问题描述】:

我有什么:

我有 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,所以虽然绘画正在创建非黑点,但我查看了所有像素,甚至放置了一个黑色像素,但周围仍然出现了一些黑点。

  • originalImage。我通过输入“500x500 图像”在谷歌上找到了这个。
  • messageImage。我在油漆上创建了这个并用 500x500 尺寸保存它(为了测试它可以只用黑色和像素绘制)。
  • 当我使用msg 时发生的非常奇怪的画面。 (问题一)
  • messageDecoded 周围有黑点。我可以称之为噪音吗? (问题2)

编辑 1:

奇怪的图像和问题1在我使用PNG图像时解决了,但是“噪音”的问题2还没有解决

【问题讨论】:

    标签: java image processing


    【解决方案1】:

    JPEG 编码可能会导致问题(噪声看起来是压缩伪影的特征)。您需要使用无损格式的图像(例如 .PNG)来缓解该问题。

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

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

    可以使用 JPEG 作为源图像;问题是由连续的 JPEG 保存/编码引起的(其中比正在编码的像素更多的像素被更改)。

    【讨论】:

    • 我只用PNG图片测试,没有出现奇怪的图片,现在msgmessageEncoded是一样的,但是最终结果还是出现了噪点。
    • @Vencovsky 你确定messageImage 不是 JPG,也不是从 JPG 到 PNG 的转换?
    • 很好,解决了问题。图片不能是JPG转PNG
    猜你喜欢
    • 2015-12-07
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2023-01-09
    • 2021-08-27
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多