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

Posted

技术标签:

【中文标题】使用 Processing 3.3.7 处理图像时出现奇怪的输出【英文标题】:Weird output while processing images with 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();

问题:

    我在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有什么区别?

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

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

编辑 1:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我只用PNG图片测试,没有出现奇怪的图片,现在msgmessageEncoded是一样的,但是最终结果还是出现了噪点。 @Vencovsky 你确定messageImage 不是 JPG,也不是从 JPG 到 PNG 的转换? 很好,解决了问题。图片不能是JPG转PNG

以上是关于使用 Processing 3.3.7 处理图像时出现奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章

C语言数字图像处理进阶---5 Cross Processing Filter

C语言数字图像处理进阶---5 Cross Processing Filter

Processing 中使用OpenCV4处理摄像头画面

Processing 中使用OpenCV4处理摄像头画面

数字图像处理:局部直方图处理(Local Histogram Processing)

处理3.3.7 - “key”变量并不总是代表最后按下的键