我有2张大小相同(500)的图像,一个是普通图像,另一幅只有黑色像素(消息)和白色像素(什么都没有。)
我在encodeImage()
中所做的工作是创建messageEncoded
,其像素为originalImage
,如果messageImage
的像素不是白色,则将其递增1。
这就是我在另一张图像中隐藏图像的方式,因此decodeImage()
应该读取originalImage
和messageEncoded
以提取messageImage
,从而创建{{1} },而白色像素不变,黑色像素不变。
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();
}
中有未使用的变量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
有什么区别?
msg
有点不对劲,为什么它有这个错误的黑点?
messageDecoded
,因此尽管颜料会创建非黑点,但我会看到所有像素,甚至放一个黑色像素,但周围仍会出现一些黑点。messageImage
。我在Google上输入了“ 500x500图片”,发现了这个问题。 originalImage
。我在油漆上创建了该图片,并用500x500尺寸保存(用于测试,可以只用黑色和像素进行绘制)。 messageImage
时发生的图片非常奇怪。 (问题1) msg
周围有黑点。我可以称之为噪音吗? (问题2) 使用PNG图像时,怪异的图像和问题1已解决,但是“噪声”的2个问题尚未解决
答案 0 :(得分:1)
很有可能是JPEG编码引起了问题(噪声看起来是压缩伪像的特征)。您需要使用无损格式的图像(如 .PNG )来减轻问题。
重新创建messageImage
,这次将其保存为 .PNG 。
将originalImage
转换为 .PNG 并修改您的代码,以便
处理会将图像另存为 .PNG 。
可以使用JPEG作为源图像;问题来自于连续的JPEG保存/编码(更改了比仅被编码的像素更多的像素)。