2011-03-08 24 views
2

考慮將圖片視爲任何視頻的幀。我正在爲有線電視開發按次付費電視系統的代碼,這就是爲什麼我想在發送端使用密鑰將bitxor(bitwise xor)全部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); 
+0

你爲什麼要這麼做?如果將標準圖像格式保存爲全黑,則不能返回。 – user623879 2011-03-08 07:52:08

+0

如果你的標題比你的問題身體長,那麼你可能會改變這個問題。請解釋你想達到的目標。 – 2011-03-08 08:33:46

+0

我正在爲有線電視開發付費觀看電視系統的代碼,那就是想要在發射器端使用一個按鍵來bitxor(按位異或)所有rgb像素或只是一種顏色來做一些導致黑色或白色屏幕。我已經寫了這段代碼,但仍然可以看到一些像素分散的圖像。 – Farooq 2011-03-08 18:59:49

回答

3

恢復銷燬的信息是不可能的,爲什麼會有人用彩色圖像存儲,如果可能的話?

重新編輯:如果您使用XOR(或任何其他任意操作)獲得(我毫不猶豫地稱這種加密)純黑色或白色圖像,這意味着「解密」所需的信息是原始圖像本身(因爲只有(a XOR b) XOR b = a,除非你使用一些mod操作或類似)。但是,爲什麼不簡單地使用現有的一種加密技術來將加密的圖像渲染成看似垃圾?另外,請看Conditional access上的維基百科條目,以獲取一些靈感。

+2

@Farooq:如果你對加密技術一無所知,你是如何找到加密有線電視公司視頻源的工作? – 2011-04-10 18:01:11

0

你必須保留一份你的彩色圖像。

rgb_I = imread('yourcolorimage.jpg'); 
gray_I = rgb2gray(rgb_I); 
imwrite(gray_I,'yourblackimage.jpg'); 
imshow(rgb_I); 
4

嚴格地說:沒有。當您存儲黑色(即顏色#000000)時,您無法恢復以前的內容。

然而,您可以將數據存儲在別處,例如在元數據中,但我想知道會有什麼好處。

我懷疑你只希望你的圖像看起來像肉眼黑。這可以按照成本(大小,信息丟失或可視性)來完成。有一些事情可以做,只是憑直覺:

  1. 損耗很大:只是把所有顏色的顏色非常接近黑色,但根據圖像的內容,你只要把一個稍微更亮或更暗黑色在您的圖像較亮/較暗的位置。這樣圖像看起來很黑,但是你可以恢復一些信息(顯然不是原始的複製品)。通過這種方式,我希望你能夠每個像素存儲1或2比特(而不是原始圖像中的8)
  2. 只是以前原理的一個小擴展。如果你想要完美的重建,並允許你的圖像大小增長,那是可能的。您只需將原始圖像中的1個像素映射到「黑色」圖像中的4個,9個,16個像素即可。例如。如果選擇9個像素,則將原始圖像的第一個位平面存儲在第一個像素集中,將第二個位平面存儲在第二個像素集中......(第9個像素集只是黑色)。

你當然可以設計一些方案來混合像素,這樣只有看到幾乎黑色圖像的位平面纔會產生一點視覺線索。在重建圖像時,您必須將其反轉。

顯然,這些例子只是快速的方法來做這樣的事情,任何熟悉steganography的人都會知道這些技巧(當然還有更好的技術),並且如果他們懷疑某些東西可能會嘗試去改變它們。

1

這是我的愚蠢的解決方案,但它足以滿足我的需求: 不是在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

相關問題