2016-04-12 30 views
0

3 480 satır x 640 sütun resmim var. Her piksel bir yoğunluk değeri taşır.Matlab hücre öğelerini tek bir vektörle birleştirin

Bununla Matlab'de okuyun:

Şimdi
object_intensities = cell(1,6); 
    for pat=1:3 
     file1 = sprintf('image%d.pgm',pat-1); 
     dummy = double(imread(file1)); 
     object_intensities{pat} = dummy; 
    end 

pat = 1 ila 3, object_intensities {pat} her bir hücre elemanı, bir 480x640 matris dizideki her görüntüyü tutan bir hücre dizisi şekildedir object_intensities .

structure{row 1, column 1} = [image1_intensity @ row1 column1 image2_intensity @ row1 column1 image3_intensity @ row1 column1] 
structure{row 1, column2} = [image1_intensity @ row1 column2 image2_intensity @ row1 column2 image3_intensity @ row1 column2] 
. 
. 
structure{row 480, column 640} = [image1_intensity @ row480 column640 image2_intensity @ row480 column640 image3_intensity @ row480 column640] 

yapmak için herhangi bir şekilde:

Şimdi ne gerek her bir hücre öğesi şöyle tek bir vektör her görüntü pikseli 3 yoğunluklarını içerdiğini 480 satır x 640 sütun şekildedir tek yapıdır Bu döngüler kullanmadan ama vektörleştirme ile?

+0

RGB kanalları için üç görüntüleri şiddetler musunuz? veya 'object_intensities' öğelerinin her bir hücresi gerçekte bir * 480 * -by- * 640 * -by- * 3 * matris mi tutuyor? Gerçekte tek bir kanal görüntüsü varsa (ki bu da 'imread' kullanımınızı dikkate aldığına şüphe duyarsa, önce gri skalaya dönüştürmeniz gerekebilir), sonra cat (3, object_intensities {:}) 'ı deneyin ve güzel bir * 480 * -by- * 640 * -by- * 3 * matrisi. Ama sonra sanırım görüntüleri yaptıktan sonra bunu yapabildin, temelde neden istediğin veri yapısını istiyorsun? Düzenli bir matris ile karşılaştırıldığında çalışmak gerçekten zor olacak. – Dan

+0

Resimler zaten gri tonlu. Her bir görüntü pikselinin yoğunluk dizisine ihtiyacım olduğu açıklanan bu veri yapısında olmasını isterim. – user1431515

+0

Bir 3D matris daha iyi olacak, hücre dizileri ile çalışmak daha zordur. Ayrıca, eminim ki 'imread', gri tonlu ya da farklı olmasa bile, görüntünüzü varsayılan olarak RGB yapacaktır. Hala dönüştürmeyi yapmanız gerekecektir. – Dan

cevap

1

İstediğiniz veri yapısı sorunludur. Üçüncü boyutun yoğunluklarınızı (sırayla) eşleştirdiği bir 3B matrisi kullanın. Çizgi ile çalışmak çok daha kolay olacak.

seni böyle bir oluşturun öneririz:

object_intensities = zeros(480,640,3); 
for pat=1:3 
    file1 = sprintf('image%d.pgm',pat-1); 
    object_intensities(:,:,pat) = rgb2gray(imread(file1)); 
end 

Şimdi ne yapısına object_intensities{i,j} olurdu sadece object_intensities(i,j,:) ve gerçekten squeeze veya permute veya (:)' çağırabilir size gerekiyorsa onu bir satır yapmaktır vektör. Ama sadece piksel başına ortalama yoğunluğunu bulmak gibi bir şey yapmak artık ne kadar kolay düşünüyorum satır başına ortalama isteseydi hücre dizisi

cellfun(@mean,object_intensities,'uni',0) %// Just a loop in disguise 

Neyle kıyasla

mean(object_intensities,3) 

mean(object_intensities,2) 

Hücre dizisi için bunu deneyin ve neden bunu önlemek istediğinizi göreceksiniz.

Ama gerçekten gerçekten yapısını istiyorsanız, o zaman yukarıdaki gibi benim kod kullanmaya 3D matris üzerine mat2cell çağırır:

mat2cell(object_intensities, ones(size(object_intensities,1),1), ones(1,size(object_intensities,2)),3) 
+0

Cevabı takdir ediyorum ama herhangi bir ortalama veya başka bir işlem bulamayacağım. Karşılaştığım eski kodda, orijinal yazımda istenen veri yapısı bunun için en iyisi olurdu. – user1431515

+0

@ user1431515 Hala bundan şüpheliyim.Ama sadece yukarıda belirtilen kodu almak için yukarıdaki kodu ['mat2cell'] (http://www.mathworks.com/help/matlab/ref/mat2cell.html) ile birlikte kullanın. Açıkçası 'demek' sadece açıklayıcıydı, bu verilerle yapmak istediğiniz hemen hemen her şey için geçerli olurdu. – Dan

+0

Diyelim ki 480x640x3 matrisinin 250 satırını kullanıyorum. Görüntü sıramımın satır 250'sini temsil eden 3x640 matris mi? – user1431515