18
Tem
2020

Matlab ile gri tonlamalı görüntüyü bloklara bölme

Matlab ile görüntü işleme çalışırken, bazı durumlarda görüntüyü eşit büyüklükte bloklara bölmek gerekebilir. Bu yazıda Matlab ile herhangi bir çözünürlükteki görüntünün, önceden tanımlanmış piksel büyüklüğündeki bloklara bölünmesi işlemi anlatılmaktadır.

Bloklara bölünecek olan görüntü; “Goruntu” adlı değişkene Goruntu = imread('D:\BW1.png')satırı ile yüklenir. Burada D:\BW1.png ile görüntü dosyasının yeri ve adı bildirilmiştir. Görüntü dosyasının png, bmp, jpg vs. uzantıda olması farketmeyecektir. Matlab neredeyse tüm görüntü formatlarını işleyebilir.

Eğer yüklenen görüntü gri tonlamalı değil de renkli bir görüntü ise bu görüntüyü gri tonlamalı forma dönüştürmek gerekir. Bunun için Goruntu = rgb2gray(Goruntu)komutu kullanılır. Eğer hâli hazırda gri tonlamalı bir görüntü yüklenmişse bu satırı silmek gerekmektedir. Aksi halde Matlab hata verecektir.

[m,n,p] = size(Goruntu) komutu ile görüntünün yatay piksel sayısı m değişkenine, dikey piksel sayısı n değişkenine ve görüntünün katman sayısı p değişkenine gönderilir. Standart bir RGB görüntü; kırmızı, yeşil ve mavi renkleri ifade eden 3 katmandan oluşur. Renkli bir görüntüye bu komut uygulandığında p’ nin değeri 3 olacaktır. Gri tonlamalı bir görüntüde ise p’ nin değeri 1 olacaktır. Ancak burada p değişkeni herhangi bir işlemde kullanılmayacaktır.

Görüntüden elden edilecek bloklardan her birinin yatay ve dikey piksel sayısı; PikselSayisi=32 kodu ile PikselSayisi değişkenine gönderilir. Örneğin 32 değeri verildiğinde oluşturulan blokların her biri 32×32 piksel boyutunda olacaktır. Burada 32 değeri kullanıcı tarafından istenildiği gibi değiştirilebilir.

Bir görüntüyü belli büyüklükte bloklara bölebilmek için, o görüntünün yatay ve dikey piksel sayısının, her bir bloğun piksel sayısına tam olarak bölünebilmesi gerekir. Örneğin 480×320 piksel çözünürlükteki bir görüntü ekstra bir işlem yapmadan 32×32 piksel büyüklüğündeki bloklara bölünebilir. Bu durumda yatayda 480/32=15 blok ve dikeyde 320/32=10 blok olacaktır, yani görüntü toplam 15×10=150 bloğa bölünecektir. Ancak görüntü 33×33 piksellik bloklara bölünmek istenirse görüntü boyutunu değiştirmek gerekecektir. Bu durumda 480×320 piksel görüntü, yatay ve dikey piksel sayısı 33′ e bölünebilen en yakın değerlere yani 462×297 piksel boyutuna getirilmelidir. Bu işlem için aşağıdaki kod satırları kullanılmıştır.

while(mod(m,PikselSayisi)>0) 
   m = m - 1; 
end; 
while(mod(n,PikselSayisi)>0) 
   n = n - 1; 
end; 
Goruntu = imresize(Goruntu,[m n]);

Görüntünün bloklarını yazmak için Bloklar = cell(m/PikselSayisi,n/PikselSayisi) komutu ile boş bir Bloklar dizisi oluşturulur. Her blok, görüntünün ilgili pikselleri ile aşağıdaki kod satırları ile doldurulur.

b_i = 0; 
for i = 1:m/PikselSayisi:m-((m/PikselSayisi)-1) 
   b_i = b_i + 1; 
   b_j = 0; 
   for j = 1:n/PikselSayisi:n-((m/PikselSayisi)-1) 
      b_j = b_j + 1; 
      Bloklar{b_i,b_j} = I(i:i+((m/PikselSayisi)-1),j:j+((m/PikselSayisi)-1));           
   end 
end

Bir bloğa erişmek için o bloğun yatay ve dikeydeki sıra numarası kullanmak gerekir. Örneğin yatayda 2. dikeyde 4. sıradaki bloğa Bloklar{2,4} ifadesi ile erişilebilir. İhtiyaç duyulursa aynı bloğun piksellerine de erişilebilir. Örneğin aynı bloğun 6. satır ve 11. sütun pikseline erişmek için Bloklar{2,4}(6,11) ifadesi kullanılabilir.

Yukarıda açıklanan kaynak kodun tamamı aşağıda verilmiştir. Bu kodu yeni bir “m file” oluşturarak kullanabilirsiniz.

Goruntu = imread('D:\BW1.png');
Goruntu = rgb2gray(Goruntu); % Görüntü zaten gri tonlamalı ise bu satırı siliniz.
[m,n,p] = size(Goruntu);
PikselSayisi=32;

while(mod(m,PikselSayisi)>0)
    m = m - 1;
end;
while(mod(n,PikselSayisi)>0)
    n = n - 1;
end;
Goruntu = imresize(Goruntu,[m n]);

Bloklar = cell(m/PikselSayisi,n/PikselSayisi);

b_i = 0;
for i = 1:m/PikselSayisi:m-((m/PikselSayisi)-1)
   b_i = b_i + 1;
   b_j = 0;
   for j = 1:n/PikselSayisi:n-((m/PikselSayisi)-1)
        b_j = b_j + 1;
        Bloklar{b_i,b_j} = I(i:i+((m/PikselSayisi)-1),j:j+((m/PikselSayisi)-1));       
   end
end

Bu kaynak kod ile yukarıdaki görüntü Matlab’ da işlendiğinde aşağıdaki gibi bloklar elde edilmiştir.

Blokları ekrana bu şekilde çizmek için Matlab “m file” sonuna aşağıdaki kod satırlarını ekleyebilirsiniz.

elno=1;
figure;
for j = 1:1:PikselSayisi
   for k = 1:1:PikselSayisi
      subplot(PikselSayisi,PikselSayisi,elno),imshow(Bloklar{j,k});
      elno=elno+1;
   end
end

 

%d blogcu bunu beğendi: