การนำอัลกอริธึมกระดาษมาใช้ใน C ++ หรือ MATLAB


14

ฉันเป็นปริญญาตรีวิศวกรรมไฟฟ้า ฉันได้อ่านเอกสารทางเทคนิคมากมายเกี่ยวกับอัลกอริธึมการประมวลผลสัญญาณและภาพ (การสร้างใหม่การแบ่งส่วนการกรอง ฯลฯ ) อัลกอริทึมส่วนใหญ่ที่แสดงในเอกสารเหล่านี้มีการกำหนดในช่วงเวลาต่อเนื่องและความถี่ต่อเนื่องและมักจะให้คำตอบในรูปของสมการที่ซับซ้อน คุณจะใช้กระดาษด้านเทคนิคตั้งแต่เริ่มต้นใน C ++ หรือ MATLAB เพื่อทำซ้ำผลลัพธ์ที่ได้ในกระดาษดังกล่าวอย่างไร

โดยเฉพาะอย่างยิ่งฉันกำลังดูกระดาษ "อัลกอริทึมการฟื้นฟูลำแสงกรวยทั่วไป" โดย Wang et al ( IEEE Trans Med Imaging 1993; 12 (3): 486-96 ) และฉันสงสัยว่าฉันจะเริ่มอย่างไร ใช้อัลกอริทึมของพวกเขา สมการที่ 10 ให้สูตรของภาพที่สร้างขึ้นใหม่ที่ คุณจะเขียนโค้ดอย่างไร คุณจะมีการวนรอบสำหรับแต่ละ voxel และคำนวณสูตรที่สอดคล้องกันหรือไม่ คุณจะเขียนโค้ดฟังก์ชันของฟังก์ชันในสูตรนั้นได้อย่างไร คุณประเมินฟังก์ชั่น ณ จุดใด ๆ

ฉันอ่านหนังสือ "การประมวลผลภาพดิจิทัล" โดย Gonzalez and Woods แต่ฉันยังคงเสีย ฉันได้อ่านเกี่ยวกับหนังสือชุดตัวเลขสูตรอาหารแล้ว นั่นจะเป็นวิธีที่ถูกต้องไหม?

อะไรคืออัลกอริธึมการเขียนโปรแกรมประสบการณ์ของคุณจากงานวิจัย? เคล็ดลับหรือข้อเสนอแนะ?


1
ฉันจะดูกระดาษเมื่อฉันมีโอกาส แต่ฉันเชื่อว่าทั้งหมดนี้เกี่ยวกับคะแนน XYZ ในกราฟิกที่กำหนด คุณกำหนดจุดสุดยอดแล้วทำงานจากที่นั่น

2
โดยปกติแล้วสัญญาณหนึ่งจะแยกสัญญาณโดยการสุ่มตัวอย่างแล้วแปลงอินทิกรัลเป็นผลรวม
nibot

ดังนั้นฉันได้อ่านเกี่ยวกับการสุ่มตัวอย่างและการแปลงอินทิกรัลเป็นผลรวม แต่คุณจะประเมินอินทิกรัลที่แต่ละจุดตัวอย่างได้อย่างไรถ้าฟังก์ชั่นในอินทิกรัลถูกเก็บไว้เป็นเมทริกซ์

1
เดเมียนคุณเคยเห็นไหมว่าการแปลงเรดอนเป็นฤ via นี่เป็นตัวอย่างที่เรียบง่ายกว่าเล็กน้อยซึ่งฉันสามารถอธิบายได้ว่ามันน่าสนใจหรือไม่ มันใช้สำหรับเอกซ์เรย์โดยใช้คลื่นระนาบแทนที่จะใช้การสุ่มตัวอย่างแบบกรวยที่อธิบายไว้ในกระดาษที่คุณโพสต์ en.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt เป็นไปได้ไหมที่จะย้ายไปยัง dsp.SE แทน?
nibot

คำตอบ:


15

อัลกอริธึมการประมวลสัญญาณที่กำหนดในเวลา / พื้นที่ / ความถี่อย่างต่อเนื่องโดยทั่วไปแล้วจะดำเนินการโดยการสุ่มตัวอย่างสัญญาณบนกริดแยกและแปลงอินทิกรัลเป็นผลรวม (และอนุพันธ์เป็นความแตกต่าง) ตัวกรองเชิงพื้นที่ถูกนำมาใช้ผ่านการแปลงด้วยเคอร์เนล convolution (เช่นผลรวมถ่วงน้ำหนักของเพื่อนบ้าน)

มีองค์ความรู้ขนาดใหญ่เกี่ยวกับการกรองสัญญาณโดเมนเวลาตัวอย่าง; ตัวกรองโดเมนเวลาถูกนำมาใช้เป็นตัวกรองการตอบสนองต่อแรงกระตุ้น จำกัดซึ่งตัวอย่างเอาต์พุตปัจจุบันถูกคำนวณเป็นผลรวมถ่วงน้ำหนักของตัวอย่างอินพุต N ก่อนหน้านี้ หรืออนันต์ฟิลเตอร์กระตุ้นการตอบสนองที่ส่งออกในปัจจุบันเป็นผลรวมน้ำหนักของปัจจัยการผลิตก่อนหน้านี้และก่อนหน้านี้เอาท์พุท อย่างเป็นทางการกรองเวลาที่ไม่ต่อเนื่องจะมีการอธิบายโดยใช้Z-แปลงซึ่งเป็นเวลาที่ไม่ต่อเนื่องอะนาล็อกไปLaplace transform bilinear เปลี่ยนแผนที่หนึ่งไปยังอีก ( c2dและd2cใน Matlab)

คุณประเมินฟังก์ชั่น ณ จุดใด ๆ

เมื่อคุณต้องการค่าของสัญญาณ ณ จุดที่ไม่ได้อยู่บนกริดตัวอย่างของคุณโดยตรงคุณจะแทรกค่าของมันจากจุดใกล้เคียง การแก้ไขสามารถทำได้ง่ายเพียงแค่เลือกตัวอย่างที่ใกล้ที่สุดคำนวณค่าเฉลี่ยถ่วงน้ำหนักของตัวอย่างที่ใกล้ที่สุดหรือปรับฟังก์ชั่นการวิเคราะห์ที่ซับซ้อนตามอำเภอใจกับข้อมูลตัวอย่างและประเมินฟังก์ชันนี้ในพิกัดที่ต้องการ interpolating บนตารางเครื่องแบบปลีกย่อยเป็นupsampling หากสัญญาณดั้งเดิม (ต่อเนื่อง) ของคุณไม่มีรายละเอียด (เช่นความถี่) ปลีกย่อยกว่าครึ่งตารางการสุ่มตัวอย่างดังนั้นฟังก์ชันต่อเนื่องสามารถสร้างขึ้นใหม่ได้อย่างสมบูรณ์แบบจากเวอร์ชั่นตัวอย่าง ( ทฤษฎีการสุ่มตัวอย่าง Nyquist-Shannon ) สำหรับตัวอย่างของวิธีที่คุณสามารถแก้ไขใน 2D ดูการแก้ไขสองทาง

ใน Matlab คุณสามารถใช้interp1หรือinterp2เพื่อทำการประมาณ 1D หรือสุ่มตัวอย่างข้อมูล 2D (ตามลำดับ) หรือgriddataเพื่อทำการสอดแทรกจากข้อมูล 2D ตัวอย่างที่ไม่สม่ำเสมอ

คุณจะมีการวนรอบสำหรับแต่ละ voxel และคำนวณสูตรที่สอดคล้องกันหรือไม่

ใช่แล้ว

Matlab ช่วยให้คุณไม่ต้องทำสิ่งนี้ผ่านทาง for-loops อย่างชัดเจนเพราะมันถูกออกแบบมาให้ทำงานกับเมทริกซ์และเวกเตอร์ (เช่นอาร์เรย์หลายมิติ) ใน Matlab สิ่งนี้เรียกว่า "vectorization" integrals ชัดเจนสามารถประมาณด้วยsum, cumsum, trapz, cumtrapzฯลฯ

ฉันอ่านหนังสือ "การประมวลผลภาพดิจิทัล" โดย Gonzalez and Woods แต่ฉันยังคงเสีย ฉันได้อ่านเกี่ยวกับหนังสือชุดตัวเลขสูตรอาหารแล้ว นั่นจะเป็นวิธีที่ถูกต้องไหม?

ใช่สูตรอาหารที่เป็นตัวเลขจะเป็นการเริ่มต้นที่ดี มันใช้งานได้จริงและครอบคลุมวิธีการทางตัวเลขส่วนใหญ่ที่คุณต้องการ (คุณจะพบว่า Matlab ใช้ทุกอย่างที่คุณต้องการอยู่แล้ว แต่ สูตรตัวเลขจะให้พื้นหลังที่ยอดเยี่ยม)

ฉันใช้คลาส "อัลกอริธึมและโครงสร้างข้อมูล" แต่ฉันไม่เห็นความสัมพันธ์ระหว่างวัสดุที่นำเสนอที่นั่นกับการใช้อัลกอริทึมทางวิทยาศาสตร์

วัสดุที่ได้รับการจัดการในหลักสูตร "อัลกอริธึมและโครงสร้างข้อมูล" มีแนวโน้มที่จะมุ่งเน้นไปที่โครงสร้างเช่นรายการอาร์เรย์ต้นไม้และกราฟที่มีจำนวนเต็มหรือสตริงและการดำเนินการเช่นการเรียงลำดับและการเลือก: ปัญหาซึ่งโดยทั่วไปแล้ว เมื่อพูดถึงอัลกอริธึมทางวิทยาศาสตร์นี่เป็นเพียงครึ่งหนึ่งของเรื่องราว อีกครึ่งหนึ่งเกี่ยวข้องกับวิธีการประมาณจำนวนจริงและฟังก์ชันการวิเคราะห์ คุณจะพบสิ่งนี้ในหลักสูตรที่ "วิธีการเชิงตัวเลข" (หรือ "การวิเคราะห์เชิงตัวเลข" เช่นนี้- เลื่อนลงสำหรับสไลด์): วิธีการประเมินฟังก์ชั่นพิเศษ, วิธีการประมาณอินทิกรัลและอนุพันธ์ ฯลฯ ที่นี่หนึ่งในภารกิจหลักคือการประเมินความถูกต้องของผลลัพธ์ของคุณและรูปแบบทั่วไปหนึ่งแบบคือ ประมาณจนกว่าจะมีความแม่นยำเพียงพอ (คุณอาจถามตัวเองว่า Matlab รู้วิธีทำอะไรง่าย ๆ แค่ประมาณค่าsin(x)สำหรับบางคนx)


ตัวอย่างง่ายๆนี่คือสคริปต์สั้น ๆ ที่คำนวณการแปลงเรดอนของรูปภาพใน Matlab การแปลงเรดอนใช้การประมาณของภาพเหนือชุดของมุมการฉาย แทนที่จะพยายามคำนวณการฉายตามมุมโดยพลการฉันจึงหมุนภาพทั้งหมดโดยใช้imrotateเพื่อให้การฉายภาพอยู่ในแนวตั้งเสมอ จากนั้นเราก็สามารถประมาณได้โดยใช้sumเนื่องจากsumเมทริกซ์คืนค่าเวกเตอร์ที่มีผลรวมอยู่ในแต่ละคอลัมน์

คุณสามารถเขียนของคุณเองหากคุณต้องการใช้imrotateinterp2

%%# 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]');

สิ่งที่ครั้งหนึ่งเคยเป็นส่วนหนึ่งของความหนาแน่นตามแนวรังสีตอนนี้กลายเป็นผลรวมของคอลัมน์ของภาพตัวอย่างที่แยกไม่ออกซึ่งพบได้จากการสอดแทรกภาพต้นฉบับบนระบบพิกัดที่ถูกแปลง


Wow @nibot ขอขอบคุณสำหรับคำตอบอย่างละเอียด ฉันใช้คลาส "อัลกอริธึมและโครงสร้างข้อมูล" แต่ฉันไม่เห็นความสัมพันธ์ระหว่างวัสดุที่นำเสนอที่นั่นกับการใช้อัลกอริทึมทางวิทยาศาสตร์ ฉันจะอ่านลิงก์ที่คุณให้ฉันและเริ่มฝึกฝนด้วยอัลกอริทึมที่ง่ายกว่า (จากหนังสือแทนที่จะเป็นเอกสาร) ขอขอบคุณอีกครั้ง
Damian

สวัสดีเดเมียนฉันแก้ไขคำตอบของคุณเพื่อแสดงความคิดเห็นของคุณ ฉันคิดว่าคุณจะพบสิ่งที่คุณค้นหาในหลักสูตรหรือหนังสือเกี่ยวกับวิธีการเชิงตัวเลข / การวิเคราะห์เชิงตัวเลข
nibot

ตลอดคำตอบ!
Victor Sorokin

@nibot: ขอบคุณสำหรับการแก้ไข ฉันชอบหลักสูตรการวิเคราะห์เชิงตัวเลขที่คุณเชื่อมโยง ทำไม "ฟิลเตอร์การตอบสนองต่อแรงกระตุ้น จำกัด " เชื่อมโยงกับการแก้ไข? ฉันสงสัยว่าทำไมนี่ไม่ใช่ส่วนหนึ่งของหลักสูตรในฐานะนักเรียน EE โอ้ดี ขอบคุณ!
เดเมียน

@Damian: ทฤษฎีการสุ่มตัวอย่างการประมาณค่า / การลดทอนการแปลง Z การแปลงแบบ bilinear และตัวกรอง FIR / IIR ได้รับการสอนในชั้นเรียนระดับปริญญาตรี / ห้องปฏิบัติการ EE เช่นสัญญาณและระบบระบบสื่อสารระบบควบคุมเชิงเส้นและอินโทร DSP ฉันใช้วิธีการเชิงตัวเลขเป็นส่วนหนึ่งของโปรแกรมสองปริญญาในวิศวกรรมคอมพิวเตอร์ ฉันไม่คิดว่ามันเป็นสิ่งจำเป็นสำหรับ EEs โดยทั่วไป
Eryk Sun

3

เพิ่มคำอธิบายที่ยอดเยี่ยมของ nibot เพียงไม่กี่จุดเพิ่มเติม

  • สภาพแวดล้อมการคำนวณเชิงตัวเลขเช่น MATLAB, Octave หรือ SciPy / NumPy จะช่วยให้คุณประหยัดได้มากเมื่อเทียบกับการทำด้วยตัวเองในภาษาโปรแกรมทั่วไปเช่น C ++ การเล่นกลกับdoubleอาร์เรย์และลูปไม่ได้เปรียบเทียบกับการมีประเภทข้อมูลเช่นตัวเลขที่ซับซ้อนและการดำเนินการเช่นอินทิกรัลที่ปลายนิ้วของคุณ (สามารถทำได้แน่นอนและรหัส C ++ ที่ดีสามารถเป็นลำดับความสำคัญได้เร็วขึ้นด้วย abstractions และ template ของไลบรารีที่ดีมันสามารถทำความสะอาดได้อย่างชัดเจนและสมเหตุสมผล แต่มันเริ่มต้นได้ง่ายกว่าเช่น MATLAB)

  • MATLAB ยังมี "ชุดเครื่องมือ" สำหรับการประมวลผลภาพและการประมวลผลสัญญาณดิจิตอลซึ่งอาจช่วยได้มากขึ้นอยู่กับสิ่งที่คุณทำ

  • การประมวลผลสัญญาณดิจิทัลของ Mitra เป็นหนังสือที่ดีในการเรียนรู้ (ใน MATLAB!) พื้นฐานของเวลาที่ไม่ต่อเนื่องตัวกรองการแปลง ฯลฯ ซึ่งเป็นความรู้ที่จำเป็นมากในการทำอัลกอริทึมทางเทคนิคที่เหมาะสม

ใช่ฉันอ่านเอกสารของเครื่องมือประมวลผลข้อมูลภาพแล้ว ฉันดูเหมือนมีประโยชน์อย่างยิ่ง แต่คำถามของฉันมุ่งไปที่การนำสิ่งนี้ไปใช้ โดยทั่วไปฉันต้องการทราบวิธีการใช้อัลกอริทึม / สูตรทางคณิตศาสตร์และนำไปใช้ (เช่น Mathworks ใช้กับ IPT) ฉันอยากรู้เกี่ยวกับรูปแบบความคิดหรือแนวทางบางอย่าง ฉันจะดูหนังสือของมิตรา ขอบคุณ!
เดเมียน

1
หากต้องการเพิ่มคำตอบข้างต้นชุดเครื่องมือ C ++ อาร์มาดิลโล่สามารถทำให้การแปลงรหัส Matlab เป็นรหัส C ++ ที่รวดเร็วได้อย่างมาก อาร์มาดิลโล่มีลักษณะคล้ายกับ Matlab คุณยังสามารถ mix'n'match Matlab และรหัส C ++ ผ่านทางอินเตอร์เฟส mex ของ Armadillo
mtall

2

วิธีการเชิงตัวเลข ปกติแล้วจะเป็นหลักสูตรระดับมหาวิทยาลัยและตำราเรียน

DSP มักจะอยู่ใกล้กับจุดตัดของวิธีการเชิงตัวเลขและการใช้งานอย่างมีประสิทธิภาพ หากคุณไม่สนใจประสิทธิภาพสิ่งที่คุณอาจมองหาคือวิธีการประมาณตัวเลขใด ๆ ที่อาจให้ผลลัพธ์ "แม่นยำเพียงพอ" สำหรับสมการที่สนใจของบทความทางเทคนิค บางครั้งอาจมีการจัดการกับข้อมูลตัวอย่างซึ่งทฤษฎีการสุ่มตัวอย่างจะทำให้ขอบเขตทั้งวิธีการเก็บข้อมูล (การกรองล่วงหน้า) และช่วงหรือคุณภาพของผลลัพธ์ที่คุณได้รับข้อมูลนั้น

บางครั้ง Matlab, สูตรคำนวณตัวเลขหรือไลบรารีการประมวลผลภาพ / สัญญาณต่างๆจะมีอัลกอริธึมหรือโค้ดที่มีประสิทธิภาพสำหรับโซลูชันตัวเลขที่ต้องการ แต่บางครั้งคุณอาจต้องม้วนตัวเองดังนั้นมันจะช่วยให้รู้คณิตศาสตร์เบื้องหลังวิธีการแก้ปัญหาตัวเลขต่าง ๆ และนั่นเป็นเรื่องใหญ่ในสิทธิของตนเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.