Здравствуйте, наткнулся на задачу, помогите пожалуйста... В одной из картинок зашифровано сообщение, другая является ключом (эталоном). Алгоритм шифрования прост: в красный канал каждого пикселя ключевой картинки добавлена уменьшенная в 100 раз интенсивность этого же пикселя из картинки с сообщением (она черно-белая). Размер картинок, естественно, одинаков. Формат - bmp. Задача: создать алгоритм расшифровки и получить сообщение...
Белибердень какая-то у меня получается. В красном канале данные отличаются. Но что должно получится при делении на 100? Если картинка чёрно белая (0;1), то тоже хрень будет. Условие непонятное.
Да я сам уже две недели мучаюсь, вот откуда взято http://www.fizmat.vspu.ru/kof/index.php?option=com_content&task=view&id=55&Itemid=67
Насколько я понял, необходимо взять красную составляющую из картинки с шифром, вычесть из нее красную составляющую эталонной картинки(или сделать xor?), умножить полученное на 100, сделать & 255 и записать в файл. Потом преобразовать в bmp.
Начну с того, что интенсивность пикселя это (R+G+B)/3, следовательно вычитаем из красного канала ключевой картинки , красный канал картинки с сообщением и получаем интенсивность пикселя выводной картинки (черно белой) т.е. интенсивность почти тоже самое, что и яркость...
dgs Да там вообще по сути большой разницы нету, как считать RGB результата. В исходных картинках разность соответствующих пикселей имеет всего три варианта: 0,8,9. Назначаем каждой из разностей любой цвет и что бы мы ни назначили, а получим всё равно фигню всякую. Что-то посередине похоже на текст, но прочитать его нереально, а вот убить глаза — вполне.
В задаче не сказано как кодируется якрость/интенсивность скрытой картинки. Как тут тебе уже подсказали, это не красный канал. Вариантов масса. Например берешь наугад три пикселя: R1k-R1m = R1m * x + G1m * y + B1m * z R2k-R2m = R2m * x + G2m * y + B2m * z R3k-R3m = R3m * x + G3m * y + B3m * z где m - message, k - key Решаешь систему уравнений, получаешь коеф. x, y, z. Считаешь по ним интенсивность скрытой картинки. Тоже самое для двух составляющих, или вообще нелинейная зависимость.
RGB чего? Сообщения? Точно нет. Между разностями красного канала и даной картинкой есть зависимость, по которой нужно восстановить интенсивность скрытой картинки. Тоесть I = F(Rk, Rm, Gm, Bm). Вот эту самую F тебе и нужно найти. Процесс нахождения имеет два принципиальных момента: 1. Выбор вида функции F (линейная, полином, етц) 2. Применение метода регрессии, как вариант метода наименьших квадратов. Приаттачил результат применения МНК к линейной функции. Если вглядываться, можно увидеть тень скрытого текста Возьми какой нибудь матлаб или октав, все руками делать - запаришься.
ИМХО эта задачка не на расшифровку и не на декодирование - черно-белая картинка лежит в R-канале в чистом виде. Однако, если максимальную интенсивность в 255 уменьшить в 100 раз, у нас останется всего пару бит динамического диапазона. Этого хватило бы для идеальной передачи двуцветного изображения, но похоже они запихнули туда другую полноцветную картинку, в результате чего почти вся полезная инфа потерялась. Вот что получилось у меня на скорую руку... вопрос теперь чисто культурологический, что за эмблема, на каком языке подпись, шо за земля так нежно убаюкана обвалакивающей материей... Сами мы не местные...
В общем, я был не совсем прав... При вычитании одной картинки из другой получается хороший монохром, но он растровый, причем растр до чрезвычайности грубый. Как извлечь из него правильные полутона не знаю. Еще вариант прочтения: Пока живу - надеюсь.
Правильная расшифровка должна читаться ляхко и не оставлять двусмысленностей. Теперь понятно что дело не в простом вычитании. А с какого бодуна в разности присутствует бошка тигра, которую я принял за эмьлему ООН? Почему в разности присутсивует голова ?
А это не разность. То есть я взял разность и убил в ней повторяющийся орнамент. А оставшиеся точки пометил на исходной картинке. Код (Text): int pat[4][4][256]; //unsigned char *k,*s; //bitmaps unsigned char kr,sr; //red components int i,j,c; for(c=0;c<256;c++) for(i=0;i<4;i++) for(j=0;j<4;j++) pat[i][j][c]=0; for(i=0;i<179;i++) for(j=0;j<240;j++) { kr=*(k+(j+i*240)*3+2); sr=*(s+(j+i*240)*3+2); if(sr==kr) pat[i%4][j%4][kr]--; if(sr>kr) pat[i%4][j%4][kr]++; } for(i=0;i<179;i++) for(j=0;j<240;j++) { kr=*(k+(j+i*240)*3+2); sr=*(s+(j+i*240)*3+2); unsigned char must=kr; if(pat[i%4][j%4][kr]>0) must+=8; if(must!=sr && must+1!=sr) { //mark pixel } } Несколько пикселей, возможно, можно пометить по другому (те, что с большой яркостью, >~200). Но погоды они не сделают.
Написанно "Покажи как сделал". Хотя в последнем слове не уверен, начинается вроде на "сде", а кончается на "*та".