使用处理3.3.7

时间:2018-10-22 02:00:42

标签: java image processing

我所拥有的:

我有2张大小相同(500)的图像,一个是普通图像,另一幅只有黑色像素(消息)和白色像素(什么都没有。)

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

这就是我在另一张图像中隐藏图像的方式,因此decodeImage()应该读取originalImagemessageEncoded以提取messageImage,从而创建{{1} },而白色像素不变,黑色像素不变。

messageDecoded

问题:

  1. 我在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(); } 中有未使用的变量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有什么区别?

  2. msg有点不对劲,为什么它有这个错误的黑点?
    • 我在颜料中制作了messageDecoded,因此尽管颜料会创建非黑点,但我会看到所有像素,甚至放一个黑色像素,但周围仍会出现一些黑点。

  • messageImage。我在Google上输入了“ 500x500图片”,发现了这个问题。 originalImage
  • originalImage。我在油漆上创建了该图片,并用500x500尺寸保存(用于测试,可以只用黑色和像素进行绘制)。messageImage
  • 当我使用messageImage时发生的图片非常奇怪。 (问题1)msg
  • msg周围有黑点。我可以称之为噪音吗? (问题2)messageDecoded

编辑1:

使用PNG图像时,怪异的图像和问题1已解决,但是“噪声”的2个问题尚未解决

1 个答案:

答案 0 :(得分:1)

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

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

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

可以使用JPEG作为源图像;问题来自于连续的JPEG保存/编码(更改了比仅被编码的像素更多的像素)。