Soru sorTek Boyutlu bir diziyi Bloklara Ayırma
Aysegul Durdu tarafından 4 yıl önce soruldu

Merhaba görüntü işeme üzerine çalışıyorum matlab de zigzag okuma yaparak bir görüntüyü tek boyutlu hale getirdim bu tek boyutlu diziyi bloklara ayırmak istiyorum daha sonra XOR işlemi yapacağım için tek satırda bloklara ayırmam gerekiyor bunun için reshape ve mat2cell komutlarını denedim istediğim sonuca ulaşamadım yardımcı olur musunuz?

13 Cevap
sayginer Yönetici tarafından 4 yıl önce cevaplandı

Merhaba,
Herhangi bir hata mı aldınız? reshape veya mat2cell kullandığınızda ne sorun yaşadınız?

Aysegul Durdu tarafından 4 yıl önce cevaplandı

Hayır hata almadım sadece görüntüyü 8*8 lik bloklara böldüm ama ben bunu zigzag işlemi yaptıktan sonra zigzaga göre yapsın istiyorum reshape kullandığımda tek boyutlu diziye göre değil direkt görüntüye göre bloklara ayırdı.

sayginer Yönetici tarafından 4 yıl önce cevaplandı

Şimdi şöyle; bahsettiğiniz zigzag okuma, XOR işlemi v.s tam olarak nedir açıkçası bilmiyorum. Ancak anladığım kadarı ile bir vektörü belirli uzunlardaki alt matris birimlerine ayırmak istiyorsunuz. Bunu hangi ayırma/bölme kuralına göre yapacağınızı söylerseniz size daha iyi yardımcı olabilirim. Yani zigzag şeklinde karelere bölmek istiyorsanız buna uygun bir döngü ile sınıflandırma yapabileceğimizi düşünüyorum.

Aysegul Durdu tarafından 4 yıl önce cevaplandı

Sağlam Kriptografik Temel Öğelerin Kaotik Seçimine Dayalı Bir Görüntü Şifreleme Algoritması üzerine çalışıyorum amacım matlab de görüntü şifleme, bunu yaparken de algoritma adımlarına göre ilerliyorum görüntüyü ZigZag şeklinde okuyup  columns haline getiriyorum bu columns larıda kendi içerisinde bloklara ayırmak istiyorum bunun için ne kullanmam gerekiyor bilmiyorum.
 

sayginer Yönetici tarafından 4 yıl önce cevaplandı

Anlıyorum, peki bu columnları nasıl bir mantığa göre ayırmak istiyorsunuz? Kaça kaçlık bir vektörünüzü kaça kaçlık alt bloklara ayırmak istiyorsunuz? Genel olarak bir vektörü matris alt birimlerine ayırmak için reshape fonksiyonu yeterli olabilir ancak sizin probleminiz için kullanımdaki sorun nedir tam olarak anlayamadım.
Yapmaya çalıştığınız şeyi daha iyi anlayabilsem çok kolay yapabileceğimizi düşünüyorum. Ekran görüntüsü v.b. paylaşır mısınız?

Aysegul Durdu tarafından 4 yıl önce cevaplandı

workspaceZigzag okuma yapılmış resim

 

sayginer Yönetici tarafından 4 yıl önce cevaplandı

Üzgünüm, sizi anlamaya çalışıyorum ama gerçekten anlayamıyorum. 1×65536'lık vektörü ne şekilde gruplamak istiyorsunuz?? 8×8'lik matrislere mi bölmek istiyorsunuz? reshape kullandığımda tek boyutlu diziye göre değil direkt görüntüye göre bloklara ayırdı demişsiniz. reshape'i kullanırken z matrisinizi kullandığınıza emin misiniz? Lütfen daha açık yazar mısınız?

Aysegul Durdu tarafından 4 yıl önce cevaplandı

Reshape kullanırken z matrisini nasıl kullanabilirim hani şu şekilde yaptığımda block_number = reshape(im,1,16,[])  
1×65536’lık vektörüne göre bloklara ayırıyor z matrisine göre bunu nasıl ayırabilirim.

hakkans Yönetici tarafından 4 yıl önce cevaplandı

Merhaba,
Son sorduğunuzdan hareketle, reshape yaparken z matrisini kullanamamanızın sebebi nedir? Kast ettiğim:

block_number = reshape(z,1,16,[])

yazdığınızda nasıl bir sorun oluşuyor?
Ayrıca üstteki bir iletinizde "reshape kullandığımda tek boyutlu diziye göre değil direkt görüntüye göre bloklara ayırdı" yazmışsınız. Bu bloklara ayırmayı yaparken tek boyutlu dizi üzerinde reshape'i neden kullanmıyorsunuz? Size daha iyi yardımcı olabilmemiz için, aşağıdaki gibi bir sözde-kod (pseudo code) yazar mısınız?

im=imread('asil.jpg') %Asil resim, boyutu ...
%Zigzag okuma, ciktisi zigzag_im, boyutu 1x65536
%Reshape komutu, beklenen boyut ...

 

Aysegul Durdu tarafından 4 yıl önce cevaplandı
im=imread('woman.jpg');      %asıl resim
im = imresize(im,[256 256]); %resmin boyutu 256 veya katı olmalı
im=rgb2gray(im);                  %gri seviye
z=ZigZagscan(im)                 %ZigZag fonksiyonunu çağırma zigzag okuma gerçekleşti
[M N]=size(im);
im(M,N)
block_number = reshape(im,1,16,[])   %Resmi 256 piksellik bloklara ayırma
x = randi([0,255],1,256)                     % 256 adet değerleri 0 ve 255 arasında değişen başlangıç vektörü üretme
for i=1:65536
cipheredImage = xor(x,block_number)   %başlangıç vektörü ile 256 pikseli içeren blok XOR lanmalı
end

Ben bu konuda çok acemiyim ilk kez çalışıyorum sabrınız için öncelikle teşekkür ederim.
Yapmak istediğim şey tek boyutlu görüntüyü 256 piksellik bloklara bölme ve başlangıç vektörü ile XOR lamak.Fakat yanlış giden birşeyler var anlayamıyorum.

hakkans Yönetici tarafından 4 yıl önce cevaplandı
block_number = reshape(im,1,16,[]) %Resmi 256 piksellik bloklara ayırma 

satırında yaptığınız şey 256 piksellik bir blok temsil etmiyor. Burada 1×16'lık bloklara ayırma yapıyorsunuz. 256 piksellik bloklara ayırma için 16'yı 256 yapmalısınız. Ayrıca aşağısında yazdığınız for döngüsünde piksel piksel gezmek istiyorsunuz sanırım ama yapmanız gereken blok blok gezmek olmalı. Bunu da block_number ın boyutunun 3. elemanından çıkarabilirsiniz:

[~,~,block_length]=size(block_number);

Sonra da for döngüsünü aşağıdaki şekilde kurmanız gerekecek galiba:

for i=1:block_length
   cipheredimage(:,:,i)=xor(x,block_number(:,:,i));
end
Aysegul Durdu tarafından 4 yıl önce cevaplandı

Evet şimdi sorun çözüldü. İlginiz ve sabrınız için Teşekkürler.