使用 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()
应该读取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();
问题:
我在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);
结果完全不同而且很奇怪。为什么? messageEncoded
和msg
有什么区别?
messageDecoded
有点不对劲,为什么会有这个错误的黑点?
我在绘画中制作了messageImage
,所以虽然绘画正在创建非黑点,但我查看了所有像素,甚至放置了一个黑色像素,但周围仍然出现了一些黑点。
originalImage
。我通过输入“500x500 图像”在谷歌上找到了这个。
messageImage
。我在油漆上创建了这个并用 500x500 尺寸保存它(为了测试它可以只用黑色和像素绘制)。
当我使用msg
时发生的非常奇怪的画面。 (问题一)
messageDecoded
周围有黑点。我可以称之为噪音吗? (问题2)
编辑 1:
奇怪的图像和问题1在我使用PNG图像时解决了,但是“噪音”的问题2还没有解决
【问题讨论】:
【参考方案1】:JPEG 编码可能会导致问题(噪声看起来是压缩伪影的特征)。您需要使用无损格式的图像(例如 .PNG)来缓解该问题。
重新创建 messageImage
,这次将其保存为 .PNG。
将 originalImage
转换为 .PNG 并修改您的代码,以便
处理将图像保存为 .PNG。
可以使用 JPEG 作为源图像;问题是由连续的 JPEG 保存/编码引起的(其中比正在编码的像素更多的像素被更改)。
【讨论】:
我只用PNG图片测试,没有出现奇怪的图片,现在msg
和messageEncoded
是一样的,但是最终结果还是出现了噪点。
@Vencovsky 你确定messageImage
不是 JPG,也不是从 JPG 到 PNG 的转换?
很好,解决了问题。图片不能是JPG转PNG以上是关于使用 Processing 3.3.7 处理图像时出现奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章
C语言数字图像处理进阶---5 Cross Processing Filter
C语言数字图像处理进阶---5 Cross Processing Filter