使用 Processing 3.3.7 处理图像时出现奇怪的输出
Weird output while processing images with Processing 3.3.7
我有:
我有 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 图片”在 google 上找到了这个。
messageImage
。我在油漆上创建了它并用 500x500 尺寸保存它(为了测试它可以只用黑色和像素绘制)。
- 当我使用
msg
时出现的非常奇怪的画面。 (问题1)
messageDecoded
周围有黑点。我可以称之为噪音吗? (问题2)
编辑 1:
使用PNG图片时出现的奇怪图片和问题1已经解决,但是"noise"的问题2还没有解决
问题很可能是 JPEG 编码引起的(噪声看起来是压缩伪像的特征)。您需要使用 .PNG 等无损格式的图像来缓解此问题。
重新创建 messageImage
,这次将其另存为 .PNG。
将 originalImage
转换为 .PNG 并修改您的代码,使
处理将图像保存为 .PNG.
可以使用JPEG作为源图片;问题来自连续的 JPEG saving/encoding(其中更改的像素多于正在编码的像素)。
我有:
我有 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 图片”在 google 上找到了这个。messageImage
。我在油漆上创建了它并用 500x500 尺寸保存它(为了测试它可以只用黑色和像素绘制)。- 当我使用
msg
时出现的非常奇怪的画面。 (问题1) messageDecoded
周围有黑点。我可以称之为噪音吗? (问题2)
编辑 1:
使用PNG图片时出现的奇怪图片和问题1已经解决,但是"noise"的问题2还没有解决
问题很可能是 JPEG 编码引起的(噪声看起来是压缩伪像的特征)。您需要使用 .PNG 等无损格式的图像来缓解此问题。
重新创建
messageImage
,这次将其另存为 .PNG。将
originalImage
转换为 .PNG 并修改您的代码,使 处理将图像保存为 .PNG.
可以使用JPEG作为源图片;问题来自连续的 JPEG saving/encoding(其中更改的像素多于正在编码的像素)。