【发布时间】: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还没有解决
【问题讨论】:
标签: java image processing