ขออภัยฉันไม่รู้ OpenCV และนี่เป็นขั้นตอนการประมวลผลล่วงหน้ามากกว่าคำตอบทั้งหมด:
ก่อนอื่นคุณไม่ต้องการเครื่องมือตรวจจับขอบ ตัวตรวจจับขอบแปลงการเปลี่ยนแปลง (เช่นมืดไปหาแสง):
เป็นสันเขา (เส้นสว่างในที่มืด) เช่นนี้
มันทำให้เกิดความแตกต่างในคำอื่น ๆ
แต่ในภาพของคุณมีแสงส่องลงมาจากทิศทางเดียวซึ่งแสดงให้เราเห็นถึงการบรรเทาของพื้นผิว 3 มิติ เรารับรู้สิ่งนี้เป็นเส้นและขอบเนื่องจากเราเคยเห็นสิ่งต่าง ๆ ในแบบ 3 มิติ แต่ไม่จริงซึ่งเป็นสาเหตุที่เครื่องตรวจจับขอบไม่ทำงานและการจับคู่แม่แบบไม่สามารถทำงานได้อย่างง่ายดายด้วยรูปภาพที่หมุน การจับคู่ที่การหมุน 0 องศาจะยกเลิกอย่างสมบูรณ์ที่ 180 องศาเพราะแสงและความมืดจะสอดคล้องกัน)
หากความสูงของเส้น mazy เส้นใดเส้นหนึ่งจากด้านข้าง:
ฟังก์ชั่นความสว่างเมื่อส่องสว่างจากด้านหนึ่งจะมีลักษณะดังนี้:
นี่คือสิ่งที่คุณเห็นในภาพของคุณ ผิวหน้าจะสว่างขึ้นและผิวหน้าจะเข้มขึ้น ดังนั้นคุณไม่ต้องการแยกความแตกต่าง คุณต้องรวมภาพตามทิศทางของการส่องสว่างและมันจะให้แผนที่ความสูงดั้งเดิมของพื้นผิว (โดยประมาณ) จากนั้นจะเป็นการง่ายกว่าที่จะจับคู่สิ่งต่าง ๆ ไม่ว่าจะผ่านการแปลง Hough หรือการจับคู่แม่แบบหรืออะไรก็ตาม
ฉันไม่แน่ใจว่าจะหาทิศทางของการส่องสว่างอัตโนมัติได้อย่างไร ถ้ามันเหมือนกันสำหรับภาพทั้งหมดของคุณ ไม่เช่นนั้นคุณจะต้องหาเส้นตัดกันที่ใหญ่ที่สุดและสมมติว่าแสงนั้นตั้งฉากกับมันหรือบางสิ่ง สำหรับตัวอย่างของฉันฉันหมุนรูปภาพด้วยตนเองเป็นสิ่งที่ฉันคิดว่าเป็นทิศทางที่ถูกต้องด้วยแสงที่มาจากด้านซ้าย:
คุณต้องลบการเปลี่ยนแปลงความถี่ต่ำทั้งหมดในภาพเพื่อเน้นเฉพาะคุณลักษณะที่มีลักษณะคล้ายเส้นที่เปลี่ยนแปลงอย่างรวดเร็ว เพื่อหลีกเลี่ยงการเรียกสิ่งประดิษฐ์ฉันใช้เบลอ 2D แบบเกาส์เซียนแล้วลบออกจากต้นฉบับ:
การรวม (ผลรวมสะสม) สามารถหลบหนีได้ง่ายซึ่งก่อให้เกิดเส้นแนวนอน ฉันลบสิ่งเหล่านี้ด้วย high-pass Gaussian อื่น แต่เฉพาะในทิศทางแนวนอนในเวลานี้:
ตอนนี้ปากใบเป็นวงรีสีขาวไปรอบ ๆ แทนที่จะเป็นสีขาวในบางสถานที่และสีดำในที่อื่น ๆ
เดิม:
แบบบูรณาการ:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
การแปลง Houghสามารถใช้ในการตรวจจับจุดไข่ปลาสันนี้ทำจาก "edge pixels" แม้ว่ามันจะมีราคาแพงมากในการคำนวณและหน่วยความจำและพวกมันก็ไม่ได้เป็นจุดไข่ปลาที่สมบูรณ์แบบ ฉันไม่เคยทำมาก่อน แต่มีผลการค้นหาจำนวนมากของ Google สำหรับ " การตรวจจับวงรี hough " ฉันจะบอกว่าถ้าคุณตรวจจับวงรีหนึ่งวงในอีกอันหนึ่งภายในช่องว่างการค้นหาที่มีขนาดมันควรนับเป็นปาก
ดูเพิ่มเติมที่: