Можно ли превратить все пиксели изображения в черный и восстановить исходное изображение позже? - PullRequest
2 голосов
/ 08 марта 2011

Рассматривая изображение как кадр любого видео. Я разрабатываю код для телевизионной системы с платой за просмотр для кабельного телевидения, поэтому я хочу использовать ключ на конце передатчика для бит-хора (побитового хора) для всехпиксели RGB или только один цвет, чтобы сделать что-то, что приводит к черному или белому экрану.Я написал этот код, но все же вижу эту картинку с разбросанными по цвету пикселями.

Я хочу использовать методику, с помощью которой изображение становится черным или белым, чтобы защитить мое видео от отписчиков и восстановить исходное изображение из этого черно-белого изображения для последующего использования.

img=imread('pepper.png');
[imr,imc,clr]=size(img);

for row=1:imr
    for col=1:imc
        for k=1:clr             
          if(k==1) 
             img2(row,col,k)=bitxor(img(row,col,k),66);
          else
             img2(row,col,k)=img(row,col,k);   
          end
        end
    end
end
imwrite(img2,'pepper.png');
imshow(img2); 

Ответы [ 5 ]

4 голосов
/ 08 марта 2011

Строго говоря: нет. Когда вы сохраняете черный (то есть цвет # 000000), вы не можете восстановить предыдущее содержимое.

Однако вы можете хранить свои данные в другом месте, например, внутри метаданных, но мне интересно, что хорошего это будет делать.

Я подозреваю, что вы хотите, чтобы ваше изображение выглядело черным невооруженным глазом. Это может быть сделано за плату (либо по размеру, потере информации или видимости). Есть некоторые вещи, которые вы можете сделать, просто интуитивно:

  1. Очень с потерями: просто поместите все цвета в цвет, очень близкий к черному, но в соответствии с содержимым вашего изображения, вы просто поместите немного более яркий или темный черный в местах, где ваше изображение будет ярче / темнее. Таким образом, изображение кажется черным, но вы можете восстановить некоторую информацию (очевидно, не точную копию оригинала). Таким образом, я ожидаю, что вы сможете хранить 1 или 2 бита на пиксель на цвет (вместо 8, как на исходном изображении)
  2. Просто небольшое расширение по предыдущему принципу. Если вам нужна идеальная реконструкция и размер вашего изображения увеличивается, это возможно. Вы просто отображаете 1 пиксель в исходном изображении на 4, 9, 16, ... пикселей на «черном» изображении. Например. если вы выберете 9 пикселей, вы сохраните первую битовую плоскость исходного изображения в первом наборе пикселей, вторую битовую плоскость во втором наборе, ... (а 9-й набор пикселей просто черного цвета).

Конечно, вы можете придумать какую-нибудь схему для смешивания пикселей вокруг, так что только просмотр битовых плоскостей вашего почти черного изображения даст мало визуального ключа. При восстановлении изображения вам придется обратить это вспять.

Очевидно, что эти примеры - просто быстрый способ сделать такую ​​вещь, любой, кто знаком с стеганографией , знает эти уловки (и, конечно, лучшие методы) и может попробовать их отменить, если они что-то подозревают .

3 голосов
/ 08 марта 2011

Восстановление уничтоженной информации невозможно, зачем кому-то хранить цветные изображения, если это было возможно?

Повторное редактирование: если вы используете XOR (или любую другую произвольную операцию) для получения (я не решаюсь назвать это шифрование) чисто черного или белого изображения, это означает, что информация, необходимая для «дешифрования», является исходным изображением ( поскольку только (a XOR b) XOR b = a, если вы не используете какую-либо операцию mod или аналогичную). Но почему бы вам просто не использовать одно из уже существующих шифрований, чтобы превратить зашифрованное изображение в мусор? Кроме того, посмотрите на статью в Википедии о Условном доступе , чтобы получить вдохновение.

1 голос
/ 10 апреля 2011

Это мое глупое решение, но оно работает достаточно для моих нужд: Не в Matlab, а в общем алгоритме шифрования изображения.

private void BitmapObfuscator(ref Bitmap img, bool obfuscate)
{
    BitmapData d = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    for (int y = 0; y < d.Height; y++) {
        unsafe
        {
            byte* row = (byte*)d.Scan0 + (y * d.Stride);
            for (int x = 0; x < d.Stride; x+=d.Stride / d.Width) {
                byte* pixelR = row + x;
                byte* pixelG = row + x + 1;
                byte* pixelB = row + x + 2;
                int shift = (x * y) % 10;
                if (shift > 8) shift = 4;
                switch (shift) {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                        *pixelR = (byte)(255 - *pixelR);
                        *pixelG = (byte)(255 - *pixelG);
                        *pixelB = (byte)(255 - *pixelB);
                        break;
                }
                int pixel = *pixelR << 16 | *pixelG << 8 | *pixelB;

                if (obfuscate)
                {
                    pixel = pixel << 4;
                    byte surplus = (byte)(pixel >> 24);
                    pixel |= surplus;
                }
                else {
                    byte surplus = (byte)(*pixelB & (byte)0x0F);
                    pixel = pixel >> 4; 
                    pixel |= surplus << 20;
                }
                *pixelR = (byte)(pixel >> 16);
                *pixelG = (byte)(pixel >> 8 & 0x000000FF);
                *pixelB = (byte)(pixel & 0x000000FF);
            }
        }
    }
    img.UnlockBits(d);
}

Она искажает изображение настолько, что делает его неузнаваемым, но алгоритм может вернуть оригинал.

Может быть, это может вам помочь, я уверен, что вы можете как-то перевести это на mathlab.

Если вам интересно, почему «переключатель»: этот метод уязвим для малоцветных изображений, это делает его менее значимым.

Это выходы: garbled output

1 голос
/ 08 марта 2011

Это напоминает мне о вызове 2008 года на Конкурс C Underhanded C: http://underhanded.xcott.com/?p=8

0 голосов
/ 08 марта 2011

Вы должны сохранить копию своего цветного изображения.

rgb_I = imread('yourcolorimage.jpg');
gray_I = rgb2gray(rgb_I);
imwrite(gray_I,'yourblackimage.jpg');
imshow(rgb_I);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...