C ++ veya MATLAB'da teknik kağıt algoritmaları uygulama


14

Ben bir Elektrik Mühendisliği lisans öğrencisiyim. Sinyal ve Görüntü işleme algoritmaları (yeniden yapılandırma, segmentasyon, filtreleme vb.) Hakkında birçok teknik makale okudum. Bu makalelerde gösterilen algoritmaların çoğu sürekli zaman ve sürekli frekans üzerinden tanımlanır ve genellikle karmaşık denklemler açısından çözümler verir. Bahsedilen makalede elde edilen sonuçları tekrarlamak için C ++ veya MATLAB'da sıfırdan bir teknik makaleyi nasıl uygularsınız?

Daha spesifik olarak, Wang ve ark.'nın ( IEEE Trans Med Imaging. 1993; 12 (3): 486-96 ) yazdığı "Genel bir koni ışını rekonstrüksiyon algoritması" makalesine bakıyordum ve nasıl başlayacağımı merak ediyordum algoritmalarını uygulamak? Denklem 10 size yeniden yapılandırılmış görüntünün formülünü verir. Bunu nasıl kodlarsınız? Her vokselden geçen ve karşılık gelen formülü hesaplayan bir for-loopunuz var mı? Bu formüldeki işlevlerin işlevlerini nasıl kodlarsınız? İşlevleri keyfi noktalarda nasıl değerlendirirsiniz?

Gonzalez ve Woods'un "Dijital Görüntü İşleme" kitabını okudum ama hala kayıptayım. Ayrıca Sayısal Tarifler kitap serisi hakkında okudum. Doğru yol bu mu?

Araştırma makalelerinden programlama algoritmaları deneyimleriniz nelerdir? Herhangi bir ipucu veya öneriniz var mı?


1
Şansım olduğunda gazeteye bir göz atacağım. Ama bunun belirli bir grafikteki XYZ puanlarıyla ilgili olduğuna inanıyorum. Bir tepe noktası tanımlar ve oradan çalışırsınız.

2
Tipik olarak, bir örnekleme ile sinyaller ayrılır ve sonra integralleri toplamlara dönüştürülür.
nibot

Örnekleme ve integralleri toplamlara dönüştürme hakkında okudum, ancak eğer integraldeki fonksiyonlar matris olarak saklanıyorsa integrali her örnekleme noktasında nasıl değerlendiriyorsunuz?

1
Damian, radon dönüşümünün geri projeksiyon yoluyla nasıl ters çevrildiğini gördün mü? Bu, ilginizi çekip çekmeyeceğini açıklayabileceğim biraz daha basit bir örnektir. Yayınladığınız makalede açıklanan konik örneklemeden ziyade düzlem dalgaları kullanarak tomografi için kullanılır. en.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt, bunun yerine dsp.SE'ye geçmek mümkün mü?
nibot

Yanıtlar:


15

Sürekli zaman / boşluk / frekansta tanımlanan sinyal işleme algoritmaları tipik olarak sinyali ayrı bir ızgarada örneklemek ve integralleri toplamlara (ve türevleri farklılıklara) dönüştürmek suretiyle uygulanır. Uzamsal filtreler, bir evrişim çekirdeğiyle (yani komşuların ağırlıklı toplamı) evrişim yoluyla uygulanır.

Örneklenmiş zaman alanı sinyallerinin filtrelenmesi hakkında büyük bir bilgi birikimi vardır; zaman alanı filtreleri, sonlu dürtü yanıt filtreleri olarak uygulanır ; burada geçerli çıktı örneği, önceki N giriş örneklerinin ağırlıklı toplamı olarak hesaplanır; veya akım çıkışının önceki girişlerin ve önceki çıkışların ağırlıklı toplamı olduğu sonsuz dürtü tepki filtreleri . Biçimsel olarak, ayrık zaman filtreleri , Laplace dönüşümünün ayrık zamanlı analogu olan z-dönüşümü kullanılarak açıklanmaktadır . Bilinear dönüşümü Haritalar başka bir tane ( ve Matlab).c2dd2c

İşlevleri keyfi noktalarda nasıl değerlendirirsiniz?

Doğrudan örnekleme ızgarasında bulunmayan bir noktada bir sinyalin değerine ihtiyacınız olduğunda , değerini yakındaki noktalardan enterpolasyon yaparsınız . İnterpolasyon, en yakın numuneyi seçmek, en yakın numunelerin ağırlıklı ortalamasını hesaplamak veya örneklenen verilere keyfi olarak karmaşık bir analitik fonksiyon yerleştirmek ve bu fonksiyonu gerekli koordinatlarda değerlendirmek kadar basit olabilir. Düzgün bir ince ızgara üzerine enterpolasyon yapmak örnekleme işlemidir . Orijinal (sürekli) sinyaliniz örnekleme ızgarasının yarısından daha ince ayrıntılar (yani frekanslar) içermiyorsa, sürekli işlev örneklenen sürümden ( Nyquist-Shannon örnekleme teoremi ) mükemmel şekilde yeniden oluşturulabilir . 2D'de enterpolasyon yapabileceğinize ilişkin bir örnek için bkz.bilinear enterpolasyon .

Matlab olarak kullanmak olabilir interp1ya da interp21D ya da düzenli olarak örneklenmiş 2B verileri (sırasıyla), ya da sokmak için griddatadüzensiz örneklenmiş 2B verilerden dayalı olarak çalışır.

Her vokselden geçen ve karşılık gelen formülü hesaplayan bir for-loopunuz var mı?

Evet kesinlikle.

Matlab, matrisler ve vektörler (yani çok boyutlu diziler) üzerinde çalışmak üzere tasarlandığından, bunu açık for-loop'larla yapmak zorunda kalmaz. Matlab'da buna "vektörleştirme" denir. Belirli integral ile yaklaşık olabilir sum, cumsum, trapz, cumtrapz, vb

Gonzalez ve Woods'un "Dijital Görüntü İşleme" kitabını okudum ama hala kayıptayım. Ayrıca Sayısal Tarifler kitap serisi hakkında okudum. Doğru yol bu mu?

Evet, Sayısal Tarifler harika bir başlangıç ​​olurdu. Çok pratiktir ve ihtiyaç duyacağınız sayısal yöntemlerin çoğunu kapsar. (Matlab'ın ihtiyacınız olan her şeyi zaten uyguladığını göreceksiniz, ancak Sayısal Tarifler mükemmel bir arka plan sağlayacaktır.)

"Algoritmalar ve veri yapıları" dersini aldım, ancak orada sunulan materyal ile bilimsel algoritmaların uygulanması arasındaki ilişkiyi görmüyorum.

"Algoritmalar ve veri yapıları" derslerinde işlenen materyaller, tamsayılar veya dizeler içeren listeler, diziler, ağaçlar ve grafikler ve sıralama ve seçme gibi işlemler gibi yapılara konsantre olma eğilimindedir: tipik olarak tek bir doğru sonucun olduğu problemler. Bilimsel algoritmalar söz konusu olduğunda, bu hikayenin sadece yarısıdır. Diğer yarısı, gerçek sayıları ve analitik fonksiyonları tahmin etme yöntemleri ile ilgilidir. Sen "Sayısal Yöntemler" (veya "Sayısal Analizi" başlıklı bir kursta bu bulacaksınız; gibi bu bir- slaytlar için aşağı kaydırın): özel işlevlerin nasıl tahmin edileceği, integrallerin ve türevlerin nasıl tahmin edileceği, vb. Burada ana görevlerden biri sonucunuzun doğruluğunu tahmin etmektir ve ortak bir model, yeterince doğru olana kadar tahmin edin. (Kendinize Matlab'ın sin(x)bazıları için değerini tahmin etmek kadar basit bir şeyi nasıl yapacağını nasıl bildiğini sorabilirsiniz x.)


Basit bir örnek olarak, Matlab'daki bir görüntünün radon dönüşümünü hesaplayan kısa bir komut dosyası. Radon dönüşümü bir görüntünün projeksiyonlarını bir dizi projeksiyon açısı üzerinden alır. Yansıtmayı keyfi bir açı boyunca hesaplamaya çalışmak yerine, tüm görüntüyü kullanarak döndürürüm imrotate, böylece yansıtma çekimi her zaman dikey olur. Daha sonra, sadece kullanarak çıkıntı sunar sum, çünkü summatris, her sütun üzerinden toplamı içeren bir vektör ile döner.

Kendi yazabilirsiniz imrotateİsterseniz kullanarak interp2.

%%# Home-made Radon Tranform

%# load a density map (image).  
A = phantom;

n_pixels = size(A, 1);  %# image width (assume square)

%# At what rotation angles do we want to take projections?
n_thetas = 101;
thetas = linspace(0, 180, n_thetas);

result = zeros(n_thetas, n_pixels);

%# Loop over angles
for ii=1:length(thetas)
    theta = thetas(ii);
    rotated_image = imrotate(A, theta, 'crop');
    result(ii, :) = sum(rotated_image);
end

%# display the result
imagesc(thetas, 1:n_pixels, result.');
xlabel('projection angle [degrees]');

Bir zamanlar bir ışın boyunca yoğunluğun bir integrali olan şey, artık orijinal görüntüyü dönüştürülmüş bir koordinat sistemi üzerinde enterpolasyon yoluyla bulunan, ayrı olarak örneklenmiş bir görüntünün bir sütununun bir toplamıdır.


Vay be @ nibot, bu kadar ayrıntılı cevap için teşekkür ederim. "Algoritmalar ve veri yapıları" dersini aldım, ancak orada sunulan materyal ile bilimsel algoritmaları uygulama arasındaki ilişkiyi görmüyorum. Bana verdiğiniz bağlantıları okuyacağım ve daha basit algoritmalarla çalışmaya başlayacağım (kağıt yerine kitaplardan). Tekrar teşekkürler
Damian

Merhaba Damian, cevabını yorumunu ele almak için düzenledim. Sayısal yöntemler / sayısal analiz hakkında bir derste veya kitapta aradığınızı bulacağınızı düşünüyorum.
nibot

Cevap boyunca!
Victor Sorokin

@ nibot: düzenleme için teşekkürler. Bağlantı kurduğunuz sayısal analiz kursunu gerçekten seviyorum. "Sonlu dürtü yanıt filtreleri" neden enterpolasyonla bağlantılıdır? Bunun neden bir enerji verimliliği öğrencisi olarak müfredatın bir parçası olmadığını merak ediyorum. Oh iyi. Teşekkürler!
Damian

@Damian: Örnekleme teorisi, enterpolasyon / decimation, Z dönüşümleri, çift doğrusal dönüşüm ve FIR / IIR filtreleri sinyaller ve sistemler, iletişim sistemleri, lineer kontrol sistemleri ve DSP'ye giriş gibi lisans EE sınıflarında / laboratuvarlarında öğretilir. Bilgisayar mühendisliğinde çift diploma programının bir parçası olarak sayısal yöntemler kullandım; Genel olarak enerji verimliliği taleplerinin gerekli olduğunu düşünmüyorum.
Eryk Sun

3

Nibot'un mükemmel açıklamasına ek olarak , sadece birkaç nokta daha.

  • MATLAB, Octave veya SciPy / NumPy gibi sayısal bilgi işlem ortamları, C ++ gibi genel bir programlama dilinde bunları tek başınıza yapmaya kıyasla size çok fazla çaba kazandıracaktır. doubleDiziler ve döngülerle hokkabazlık yapmak , karmaşık sayılar ve integraller gibi veri türlerinin parmaklarınızın ucunda olmasıyla karşılaştırılamaz. (Elbette yapılabilir ve iyi C ++ kodu daha hızlı bir büyüklük sırası olabilir, iyi kütüphane soyutlamaları ve şablonları ile makul derecede temiz ve net olabilir, ancak örneğin MATLAB ile başlamak kesinlikle daha kolaydır.)

  • MATLAB, örneğin, Görüntü İşleme ve Dijital Sinyal İşleme için ne yaptığınıza bağlı olarak çok yardımcı olabilecek "araç takımlarına" sahiptir .

  • Mitra'nın Dijital Sinyal İşleme , iyi bir teknik algoritma yapmak için oldukça zorunlu bir bilgi olan ayrık zaman, filtreler, dönüşümler vb.'nin temellerini öğrenmek için iyi bir kitaptır (MATLAB! 'Da).

Evet, Görüntü İşleme Araç Kutusu belgelerini okudum. Son derece kullanışlı görünüyorum, ancak sorum böyle bir şey uygulamaya yönelikti. Temel olarak, bir matematiksel algoritma / formülün nasıl alınacağını ve nasıl uygulanacağını bilmek istedim (Mathworks'ün IPT ile yaptığı gibi). Düşünce modelini veya bazı yönergeleri bilmek istedim. Mitra'nın kitabına bakacağım. Teşekkürler!
Damian

1
Yukarıdaki cevaba eklemek için, Armadillo gibi C ++ araç takımları Matlab kodunun hızlı C ++ koduna dönüştürülmesini büyük ölçüde basitleştirebilir. Armadillo'nun sözdizimi Matlab'a benzer. Ayrıca Matlab ve C ++ kodlarını Armadillo'nun mex arabirimi üzerinden karıştırabilirsiniz.
Ocak'ta

2

Sayısal yöntemler. Genellikle üst bölüm bir üniversite dersi ve ders kitabıdır.

DSP genellikle sayısal yöntemlerin ve verimli uygulamanın kesişimine yakındır. Verimliliği göz ardı ederseniz, aradığınız şey, teknik makalenin ilgili denklem (ler) i için "yeterince doğru" sonuç üretebilecek herhangi bir sayısal yaklaşım yöntemidir. Bazen, örnekleme teoremlerinin hem veri toplama yöntemine (ön filtreleme) hem de bu verilere verilebilecek sonuçların aralığına veya kalitesine bazı sınırlar getireceği örneklenmiş verilerle uğraşılıyor olabilir.

Bazen Matlab, sayısal tarifler veya çeşitli görüntü / sinyal işleme kütüphaneleri, istenen sayısal çözüm için etkili algoritmalara veya koda sahip olabilir. Ancak bazen kendi başınıza dönmeniz gerekebilir, bu nedenle çeşitli sayısal çözüm yöntemlerinin arkasındaki matematiği bilmenize yardımcı olur. Ve bu kendi başına büyük bir konu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.