การประมวลผลภาพ: วิธีการตรวจหาป้ายสัญญาณ Quadrialteral ในภาพ?


14

ฉันจะตรวจสอบป้ายรูปสี่เหลี่ยมขนมเปียกปูนจากภาพที่ถ่ายด้วยโทรศัพท์มือถือได้อย่างไร ฉันจะตรวจจับรูปร่างเช่นสี่เหลี่ยมได้อย่างไร สี่เหลี่ยมผืนผ้ามุมมน (มุมโค้งมนแทนมุมรูปร่าง)?

ฉันกำลังใช้ opencv.wrapper แต่ฉันใหม่กับมัน

ขอบคุณ

นี่คือตัวอย่าง: alt text http://www.freeimagehosting.net/uploads/b03442fd36.png

alt text http://www.freeimagehosting.net/uploads/e6b36040e8.png

เนื่องจากเสียงรบกวนและมีหลายบรรทัดฉันไม่สามารถตรวจสอบว่าเป็นเส้นเขตแดนของป้าย บางครั้งฉันสามารถหาขอบเขตของเส้นหลังจากแปลง Hough ฉันติดกับ .... ในสถานการณ์แบบนี้ ...

นี่คือภาพดิบ 2 ภาพที่ถ่ายจากกล้องโทรศัพท์มือถือ

alt text http://www.freeimagehosting.net/uploads/6dbd613edf.jpg ข้อความ ALT http://www.freeimagehosting.net/uploads/720da20080.jpg

ฉันต้องการคำแนะนำเพื่อที่จะดูว่าฉันสามารถประมวลผลภาพเพื่อกำจัดป้ายโฆษณาได้อย่างไร

ขอบคุณมาก


2
คำหลัก: opencv, hough transform ซ้ำกัน: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

ใช่แปลง hough แล้ว FTW!

แต่มีสัญญาณรบกวนในภาพฉันจะทราบได้อย่างไรว่าขอบเขตใดของป้ายโฆษณา

@ xabi123: การแปลง hough, threshold, อ่านขอบเขต

1
คุณสามารถแบ่งปันภาพตัวอย่างได้ไหม?

คำตอบ:


7

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

แต่: สัญญาณที่คุณกำลังมองหามีคุณสมบัติอื่น ๆ ที่ควรตรวจจับได้ง่ายกว่า:

  • มีพื้นหลังเครื่องหมายมีความสว่างคงที่ (เกือบ)
  • มันใช้พื้นที่ค่อนข้างมากของภาพ
  • มันอยู่ใกล้กับศูนย์กลางของภาพ

ดังนั้นคุณกำลังมองหาพื้นที่เชื่อมต่อขนาดใหญ่ที่มีคอนทราสต์ต่ำ ฉันแฮ็กอัลกอริทึมพิสูจน์แนวคิดใน Mathematica (ฉันไม่ใช่ผู้เชี่ยวชาญ OpenCV แต่ฉันจะพูดถึงฟังก์ชั่น OpenCV นั้น ๆ เมื่อฉันรู้จัก)

ก่อนอื่นฉันใช้ตัวกรองอนุพันธ์ gaussian เพื่อตรวจจับขนาดการไล่ระดับสีในแต่ละพิกเซล ตัวกรองอนุพันธ์ gaussian มีรูรับแสงกว้าง (11x11 พิกเซลในกรณีนี้) ดังนั้นจึงไม่มีความไวต่อเสียงรบกวน จากนั้นฉันปรับภาพไล่ระดับสีให้เป็นมาตรฐานโดยเฉลี่ย = 1 ดังนั้นฉันจึงสามารถใช้เกณฑ์เดียวกันสำหรับตัวอย่างทั้งสองได้

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

การดำเนินงาน OpenCV: คุณสามารถใช้sepFilter2Dสำหรับการกรองที่เกิดขึ้นจริง แต่เห็นได้ชัดว่าคุณจะมีการคำนวณค่าตัวกรองเคอร์เนลตัวเอง

ผลลัพธ์จะเป็นดังนี้:

ขนาดไล่ระดับสี

ในภาพนี้พื้นหลังเครื่องหมายมืดและเส้นขอบสัญญาณสว่าง ดังนั้นฉันสามารถสร้างภาพนี้และค้นหาส่วนประกอบที่เชื่อมต่อมืด

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

การดำเนินงาน OpenCV: กำหนดเกณฑ์ขั้นต่ำควรจะตรงไปตรงมา แต่ฉันคิดว่า OpenCV ไม่ได้มีการวิเคราะห์องค์ประกอบการเชื่อมต่อ - คุณสามารถใช้เติมน้ำท่วมหรือcvBlobsLibว่า

ทีนี้เพียงหาหยดที่ใหญ่ที่สุดใกล้กับศูนย์กลางของภาพแล้วหาเปลือกนูน (ฉันใช้แค่หยดที่ใหญ่ที่สุดที่ไม่ได้เชื่อมต่อกับพื้นหลัง แต่นั่นอาจไม่เพียงพอสำหรับทุกภาพ)

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


0

อีกวิธีหนึ่งที่คุณสามารถทำได้ซึ่งมีความทนทานต่อเสียงรบกวนในสถานการณ์นี้คือการสร้างเส้นโค้งของระดับสีเทาเฉลี่ยของภาพตามแนวแกน x และตามแกน y นั่นคือคำนวณระดับสีเทาเฉลี่ยสำหรับแต่ละบรรทัด / คอลัมน์ในภาพ

ตัวอย่างเช่นถ้าป้าย (หรือเส้นขอบ) มีน้ำหนักเบากว่าสภาพแวดล้อม (ซึ่งเป็นกรณีของตัวอย่างทั้งหมดที่แสดงในคำถาม) คุณจะมียอดเขาสองจุดในโค้ง x แกนของคุณ (สำหรับซ้ายและขวาและเส้นขอบ ) และสองจุดสูงสุดในโค้ง y แกนของคุณ (สำหรับขอบบนและล่าง) การใช้เทคนิคการตรวจจับเส้นขอบสำหรับสัญญาณ 1 มิติ (อาจเป็นตัวกรอง high-pass) คุณสามารถอนุมานพิกัดมุมของป้ายได้

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


อืม .. จะเกิดอะไรขึ้นถ้าหมุนป้ายหรือกล้องหมุน?
มุสตาฟา

0

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

นี่คือโครงร่างของแนวคิด:

  • ตรวจสอบข้อความในภาพ ไม่จำเป็นต้องมีการนำไปใช้อย่างมีประสิทธิภาพ (คุณควรจะสามารถ google บางไลบรารีขนาดเล็กที่ทำเช่นนั้นหรือ OpenCV อาจมี) เพียงแค่ประมาณคร่าวๆของข้อความในภาพ
  • ค้นหา cener ของการตรวจจับข้อความทั้งหมด แม้จะมีภาพที่มีเสียงดังก็ควรอยู่รอบสถานที่จริง
  • ทำ Hough สี่เหลี่ยมผืนผ้า decetionกับพื้นที่รอบการตรวจจับข้อความ อาจใช้ระยะห่างมัธยฐานจากกึ่งกลางของการตรวจจับข้อความหรือสิ่งที่คล้ายกัน ทำขนาดเส้นผ่าศูนย์กลางที่แตกต่างกันและใช้เวลาการเรียกคืนที่แข็งแกร่ง

คำอธิบายและข้อดี:

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