ฉันจะกรอง lowpass ด้วยการลดเฉพาะข้อมูลสูงสุดได้อย่างไร


16

ฉันมีภาพ 2 มิติซึ่งฉันต้องการกรองสัญญาณต่ำด้วยข้อ จำกัด / ตัวชี้วัดคุณภาพเหล่านี้:

  1. ฉันไม่สามารถ "เพิ่ม" แสงให้กับภาพดังนั้นแต่ละพิกเซลในผลลัพธ์ควรเป็น <= พิกเซลที่สอดคล้องกันในอินพุต
  2. ความถี่ cutoff ต่ำสุดควรเป็นพารามิเตอร์สำหรับการทดสอบ
  3. การใช้ตัวกรองนี้ซ้ำ ๆ ไม่ควรเปลี่ยนผลลัพธ์อย่างมีนัยสำคัญ
  4. เวลาที่ใช้ในการเรียกใช้อัลกอริธึม (5 นาทีสำหรับภาพ 5MPix นั้นสมเหตุสมผล)
  5. ลดปริมาณแสงที่ถูกกรองให้น้อยที่สุด

ด้านล่างนี้เป็นวิธีที่ฉันลองใช้พร้อมกับข้อบกพร่อง:

  1. ตัวกรองแบบเกาส์เหมือนปกติจากนั้นดึงผลลัพธ์ลงมาเพื่อให้สอดคล้องกับข้อ จำกัด 1. สิ่งนี้สอดคล้องกับ 3 จุดแรกได้เป็นอย่างดี แต่ลดแสงได้มากกว่าที่จำเป็นมาก

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

  3. ใช้รูปแบบอื่น ๆ ของฟังก์ชั่น "พื้นฐาน" 2D และการแก้ปัญหาเชิงเส้นเพื่อค้นหาพารามิเตอร์ที่ดีที่สุด นี่เป็นความคิดในปัจจุบันเท่านั้นยังไม่ได้ใช้งาน / ทดสอบ

ประสบการณ์ในการประมวลผลสัญญาณของฉันเกือบจะเป็นการประมวลผลภาพเท่านั้นดังนั้นฉันหวังว่าจะหาทางเลือกสำหรับปัญหานี้โดยอินพุตของผู้เชี่ยวชาญที่ใช้งานในด้านอื่น ๆ ของการประมวลผลสัญญาณ

อัปเดต 2011/08/18

จากปฏิกิริยาปัจจุบันฉันตัดสินใจที่จะทำให้สิ่งต่าง ๆ ชัดเจนขึ้นโดยการเพิ่มกราฟของอินพุตปกติและผลลัพธ์ของ 3 วิธีที่ฉันอธิบายไว้ตั้งแต่แรก + คำแนะนำที่ฉันได้รับจนถึงตอนนี้ เพื่อการเปรียบเทียบที่ง่ายฉันใช้ตัวกรอง 1D ในตัวอย่างเหล่านี้

ข้อมูลอินพุต: ป้อนข้อมูล

ตัวกรองแบบเกาส์ + นำมาลงเพื่อให้เป็นไปตามข้อกำหนด (1)
คุณจะเห็นได้ว่าการลดระดับลงนั้นส่งผลให้การลดลงของแสงที่ไม่จำเป็นทางด้านขวามือ Gaussian กรองแล้ว

Parabolas
เท่าที่ฉันเป็นห่วงมันยอดเยี่ยมมากและน่าเศร้าที่มันไม่แปลเป็น 2D ได้อย่างสมบูรณ์โดยการใช้แนวนอนแรกแล้วตามแนวตั้ง ในกรณีนี้คุณจะเห็นว่าฉันสามารถประเมินพาราโบลาที่ติดตั้งได้ในการแก้ปัญหาจุดลอยตัวซึ่งเป็นข้อดีเล็กน้อย แต่ไม่จำเป็นอย่างยิ่ง พาราโบลา

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

ค่ามัธยฐานการกรอง
รวมไว้เพื่อความครบถ้วนเท่านั้นไม่ใช่สิ่งที่ฉันต้องการจริงๆ ค่ามัธยฐานตัวกรอง

ข้อมูลดิบ
ฉันวางข้อมูลดิบ + คำสั่งหลามแบบต่างๆบน pastebin เพื่อให้คุณสามารถทดสอบด้วยข้อมูลเดียวกันได้
http://pastebin.com/ASnJ9M0p


1
คุณช่วยอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับข้อ จำกัด ที่ 1 และ 5 ได้ไหม? พวกเขาดูเหมือนจะขัดแย้งกันตั้งแต่แรกเห็น
Peter K.

ฉันอาจเข้าใจผิดว่าคุณหมายถึงอะไรโดย "อัลกอริทึมนี้" แต่ 5 นาทีสำหรับ 5 MP ดูเหมือนจะเป็นเรื่องที่มากสำหรับการใช้ตัวกรอง lowpass
bjoernz

คำตอบ:


8

แน่นอนว่ามีเวอร์ชั่น 2 มิติสำหรับความพยายามของคุณ # 2 - มันคล้ายกันในทางทฤษฎี แต่มันไม่สามารถย่อยสลายเป็นการดำเนินการ 1D สองครั้งได้ โปรดอ่านเกี่ยวกับ "การกรองทางสัณฐานวิทยาสีเทา 2D" มันเร็วกว่าการปรับโค้ง

การกรองค่ามัธยฐานอาจมีประโยชน์หากคุณพยายามลบจุด รูปแบบการกรองขั้นสูงเพิ่มเติมคือ "การกรองตามลำดับ"

ในทุกกรณีความต้องการ # 1 สามารถทำได้เพียงเล็กน้อยโดยการกำหนดค่าพิกเซลต่ำสุดระหว่างเอาต์พุตและอินพุต มันเป็นเกณฑ์คุณภาพที่สำคัญ แต่จะไม่ จำกัด ตัวเลือกของอัลกอริทึม


การกรองแบบเกาส์ (และตัวกรองที่มีประโยชน์อื่น ๆ ) สามารถแยกย่อยได้ (ครั้งแรกจากการดำเนินการ 2D ถึง 1D จากนั้นผ่านการแปลงฟูริเยร์) แต่มีเทคนิคการประมวลผลภาพที่มีประโยชน์อื่น ๆ อีกมากมายที่ไม่สลายตัว ประโยชน์ของพวกเขา


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

6
ข้อเสนอแนะของ rwong เกี่ยวกับการกรองแบบมัธยฐานช่วยได้หรือไม่? การอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่คุณพยายามทำโดยการนำเสนอตัวอย่างง่ายๆของข้อมูลและตัวอย่าง "ปลอม" ของสิ่งที่คุณต้องการออกไปอาจช่วยได้
Peter K.

ฉันอัพเดตคำถามด้วยข้อมูลตัวอย่าง + ผลลัพธ์จากคำแนะนำที่หลากหลาย ฉันหวังว่าทุกอย่างจะชัดเจนขึ้น
Pieter-Jan Busschaert

2

ฉันขอแนะนำให้ใช้เส้นโค้งที่ราบเรียบ

นี่คือวิธีที่คุณสามารถทำได้โดยใช้ Matlab ด้วยฟังก์ชั่นการปรับเส้นโค้งเรียบSMOOTHNจาก Matlab File Exchange (ซึ่งมีซอร์สโค้ดแบบเต็มเพื่อให้คุณสามารถนำไปใช้ที่อื่นได้ตามต้องการ) โปรดทราบว่ามันทำงานกับข้อมูล n-มิติเช่นกัน:

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณสำหรับคำแนะนำของคุณฉันจะตรวจสอบ จากกราฟของคุณดูเหมือนว่าฉันจะต้องปรับให้เรียบยิ่งขึ้นแฟคเตอร์กว่าตัวอย่างของคุณ ขอบสูงชันรอบ x = 700 ไม่ได้ถูกลบออกและจะมองเห็นได้ชัดเจน นอกจากนี้การชนเริ่มต้นใน x = [0, 400] จะไม่ถูกลบออกเลย คุณไม่คิดว่านี่จะมีปัญหาเช่นเดียวกับวิธีอื่น ๆ (ตัวกรอง low-pass + เลื่อนลง)? คุณสามารถเห็นการชดเชยทั่วโลกระหว่างสองกราฟซึ่งอาจจะเพิ่มขึ้นเมื่อฉันใช้เครื่องปรับเรียบที่สูงขึ้น
Pieter-Jan Busschaert

@ Pieter-JanBusschaert: โอ้ฉันคิดว่ายอดเขาแรกนั้นมีประโยชน์กับคุณบ้าง อย่างไรก็ตาม low-pass-filter + down-down ทั้งหมดจะมีปัญหากับการขึ้นชันที่ ~ 650: พวกมันจะทำให้ส่วนนี้แบนขึ้นและทำให้เส้นโค้งต้องเลื่อนลงมาก ค่ามัธยฐานตัวกรองตามด้วยเส้นโค้งที่ราบเรียบช่วยเล็กน้อย
Jonas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.