kişisel internet günlüğü
Resimlerde indeksleme yaparken “doğrusal indeksleme” (linear indexing) kullanmak çok faydalı olabiliyor. Bu konu hakkında yazmayı düşündüm.
Şimdi küçük bir matris oluşturarak başlayalım. Bir sihirli matris yaratalım :)
A = magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
SORU: A(17) kaçtır?
A(17)
ans =
14
MATLAB, matrisler için tek indeks kullandığımızda, (c gibi çoğu programlama dilinin tersine) sütun sırası ile gider. Yani A(17), 4. sütunun 2. satırıdır: A(2,4).
A(2, 4)
ans =
14
Şimdi yaptıklarımızın imge işleme ile ne ilgisi olduğuna bakalım. Varsayalım ki A bizim imgemiz, birkaç hesap sonunda alttaki satır ve sütunların aradığımız piksellerin indeksleri olduğunu bulduk:
satir = [2 1 5]; sutun = [1 3 4];
Bu piksellere tek ifade ile erişebilir miyiz? Deneyelim:
A(satir, sutun)
ans =
23 7 14
17 1 8
11 25 2
Ne yazık ki üç yerine dokuz değer döndü, bizim istediğimiz bu değildi. MATLAB bu ifadeyi yazdığımız satır ve sütun değerlerinin kesişimi olarak verdi. Yani toplamda dokuz kesişim noktası.
Çift indeks yerine tek indeks kullanmamız gerekiyor. Yani:
M = size(A, 1); indeksler = M * (sutun - 1) + satir
indeksler =
2 11 20
A(indeksler) ifadesi bizim istediğimiz üç değeri döndürecek:
A(indeksler)(A, 1); indeksler = M * (sutun - 1) + satir
ans =
23 1 2
Bu değerleri değiştirebilirdik de:
A(indeksler) = Inf
A =
17 24 Inf 8 15
Inf 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 Inf 9
Aslında yaptığımız işlem MATLAB’da fonksiyon olarak bulunuyor. sub2ind ve ind2sub fonksiyonları satır-sütun indekslemesi ve doğrusal indeksleme arasında dönüşüm sağlıyor.
indeksler = sub2ind(size(A), satir, sutun)
indeksler =
2 11 20
[satir, sutun] = ind2sub(size(A), indeksler)
satir =
2 1 5
sutun =
1 3 4
Yorum Ekle