[Çözüldü] Python ile Görüntü İşleme (Steganografi)

Merhabalar, belirli bir resim dosyası üzerinde bit bazlı değişiklikler yaparak bir mesaj gizlemek istiyorum. Bunun için başlangıç olarak, LSB(son değersiz bit) algoritmasını kullanmaya çalışıyorum.

Kodun içinde değiştirdiğimde düzgünce değişiyor, ancak yeni resimi oluşturduktan sonra önceki resimle aynısı oluyor, içinde bir değişiklik olmuyor. Ufak bir örnek koyuyorum.

import cv2
import numpy as np

image = cv2.imread("SpaceX.jpg") # Resim dosyasını okuyorum

pix = image[0, 0] # İlk pikseli alıyorum
pix[0] -=1 # İlk pikselin ilk değerini değiştiriyorum

image[0, 0] = tuple(pix) # Yeni pikseli resimin ilk pikseline yerleşitiriyorum
print(image[0, 0])
cv2.imwrite("SpaceX2.jpg", image) # Yeni bir resim oluşturuyorum.

image2 = cv2.imread("SpaceX2.jpg") # Yeni resim
print(image2[0, 0]) # İlk piksel, üstte değişiklik var ancak yeni resimde yok

Bir tane piksel fotoğrafta değişiklik yapmaz ama asıl fotoğrafa göre sahte olduğunu ogrenirsiniz bazıları özel yöntemlerle fotoğrafı bitlere çevirdiğinde yazı yazmasını sağlıyor bunun kanıdini sağlamış olursunuz yani resim asıl resim ile eşit değil belki steno yapılmıştır diyebilirsiniz

Yapmak istediğim bu, ancak niyeyse bit değişikliğinden sonra yeniden kaydetme işleminde istediğim değişiklikler kayıt olmuyor.

Burası yeterli olacaktır;

Bunu kayipsiz bir formatta yapmak zorundasin. LSB (en az degerli bit) tanim geregi kayipli sikistirmada ilk giden bilgi.

Ornege bakmadim bile; PNGyle filan olmazsa tekrar yaz.

Bu da yanlis:

Pixel degeri 10000000 ise 1111111 yapiyor; butun bitleri degistiriyor.

Bit değişiklikliği için haklısınız, oralarda düzenleme yapılır. Benim bu problemde anlatmak istediğim cv2.imwrite fonksiyonunun istediğim gibi çalışmaması. Bu fonksiyonla değiştirilmiş bitleri kaydedemiyorum sıkıntı o. Yanlış da kullandığımı düşünmüyorum aslında ama anlayamadım işte.

Attığım stack konusunu inceler misiniz ?

```
from PIL import Image
im = Image.open('leaf.jpg')
pixelMap = im.load()

img = Image.new( im.mode, im.size)
pixelsNew = img.load()
for i in range(img.size[0]):
    for j in range(img.size[1]):
        if 205 in pixelMap[i,j]:
            pixelMap[i,j] = (0,0,0,255)
        else:
            pixelsNew[i,j] = pixelMap[i,j]
img.show()

İllaha o modülle yapacağım diyorsanız ayrı ama bu şekilde yapılıyor.

Nereden biliyorsun? Nasil calismasini istiyorsun? Nasil calisiyor?

Nasil denedin?

Dogru kullaniminin ornegini verir misin? Yukaridaki yanlis cunku.

LSB Steganografi yapmak için son bitleri değiştirip veriyi gizleriz, burda hemfikiriz. imwrite fonksiyonun en basit çalışma açıklaması şu; “Görüntüyü belirtilen dosyaya kaydeder.”

Şimdi ben görüntüde piksel değişiklikleri yaptım, yine aynı kodun için içinde baktım değişmiş mi diye tamam değişmiş. Ama iş yaptığım değişiklikleri kaydetmeye gelince (imwrite ile) olmuyor, bunu anlatmaya çalışıyorum. Ayrıca kullanım şekli de bu;

cv2.imwrite(filename, img[, params]) 

https://docs.opencv.org/3.0-alpha/modules/imgcodecs/doc/reading_and_writing_images.html

@Asosyal_Futbolcu dediğin gibi sanırım modül değiştireceğim, ayriyeten sana da teşekkür ederim ilgilendiğin için.

1 Beğeni

Yaptigin degisikliklerin kaydedilebilecegi bir format kullaniyorsun, degil mi? :

Kutuphanede bir bug oldugunu dusunuyorsan tum kodu ve girdi/cikti dosyalarini ver, bakalim.

Öncelikle konuyu geç cevapladığım için özür dilerim.

Sorunun çözümünü modül değişikliği ile sağladım. Pillow modülü rahatlıkla pikseller üzerinde işlemleri hallettim, ilgilenen herkese teşekkür ederim.

Eğer o modülle çözüldüyse çözülen koda çözüldü bırakın ki sizin gibiler de görebilsin :slight_smile:

Teşekkürler şimdiden…

Orijinal kod da calisiyordu zaten. Sonradan geleceklere yon gosteriyorsak:

JPEG ILE BIT SEVIYESINDE STEGANOGRAFI YAPAMAZSINIZ, JPEG DUSUK BITLERI SILEN KAYIPLI BIR SIKISTIRMA FORMATIDIR.

2 Beğeni