Что у меня есть:
У меня есть 2 изображения одинакового размера (500), одно из них является обычным, а у другого есть сообщение только с черными пикселями (сообщение) и белых пикселей (ничего).
Что я делаю в encodeImage()
, так это создаю messageEncoded
с пикселями originalImage
и увеличиваем его на 1, если пиксель messageImage
отсутствуетt white.
Вот как я скрываю изображение в другом изображении, поэтому 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();
}
Проблемы:
У меня есть переменная 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
в краске, так что я, хотя краска создает не черные точки, но я смотрю все пиксели, даже помещаю один черный пиксель и по-прежнему появляется несколько черных точек вокруг него.
originalImage
.Я нашел это в Google, набрав «500x500 изображений». messageImage
.Я создал это на рисовании и сохранил его с размерами 500x500 (для тестирования можно и рисовать только черным цветом и пикселями). - Очень странная картина, которая возникает, когда яиспользуйте
msg
.(Задача 1) messageDecoded
имеют черные точки вокруг него.Могу ли я назвать это шумом?(Проблема 2)
Редактировать 1:
Странное изображение и проблема 1 решаются, когда я использую изображения в формате PNG, но проблема 2«шум» еще не исправлен