क्षमा करें, मुझे OpenCV का पता नहीं है, और यह पूर्ण उत्तर की तुलना में एक पूर्व-प्रसंस्करण कदम है:
सबसे पहले, आप एक किनारे डिटेक्टर नहीं चाहते हैं। एक एज डिटेक्टर ट्रांज़िशन को परिवर्तित करता है (जैसे डार्क-टू-लाइट):
लकीरें (अंधेरे पर उज्ज्वल रेखाएं) इस तरह से हैं:
यह एक भेदभाव करता है, दूसरे शब्दों में।
लेकिन आपकी छवियों में, एक दिशा से एक प्रकाश चमक रहा है, जो हमें 3 डी सतह की राहत दिखाता है। हम इसे लाइनों और किनारों के रूप में देखते हैं, क्योंकि हम 3 डी में चीजों को देखने के लिए उपयोग किए जाते हैं, लेकिन वे वास्तव में नहीं हैं, यही कारण है कि एज डिटेक्टर काम नहीं कर रहे हैं, और टेम्पलेट मिलान घुमाए गए चित्रों के साथ आसानी से काम नहीं करेगा (एक आदर्श 0 डिग्री रोटेशन पर मैच वास्तव में 180 डिग्री पर पूरी तरह से रद्द हो जाएगा, क्योंकि प्रकाश और अंधेरे एक-दूसरे के साथ पंक्तिबद्ध होंगे)।
यदि इन में से किसी एक की ऊँचाई रेखाओं की तरह दिखती है:
तब चमक समारोह जब एक तरफ से रोशन इस तरह दिखेगा:
यह आप अपनी छवियों में देखते हैं। सामने की सतह चमकीली हो जाती है और पीछे की सतह गहरी हो जाती है। इसलिए आप अंतर नहीं करना चाहते हैं। आपको रोशनी की दिशा के साथ छवि को एकीकृत करने की आवश्यकता है , और यह आपको सतह की मूल ऊंचाई का नक्शा (लगभग) देगा। फिर चीजों का मिलान करना आसान होगा, चाहे हाउ ट्रांसफॉरमेशन या टेम्प्लेट मिलान के जरिए या जो भी हो।
मुझे यकीन नहीं है कि रोशनी की दिशा खोजने के लिए कैसे स्वचालित किया जाए। यदि यह आपकी सभी छवियों के लिए समान है, तो बढ़िया है। अन्यथा आपको सबसे बड़ी कंट्रास्ट लाइन ढूंढनी होगी और यह मान लेना चाहिए कि प्रकाश इसके लिए लंबवत है या कुछ और है। मेरे उदाहरण के लिए, मैंने छवि को मैन्युअल रूप से घुमाया जो मैंने सोचा था कि सही दिशा थी, जिसमें बाईं ओर से प्रकाश आ रहा था:
आपको छवि में सभी कम-आवृत्ति परिवर्तनों को हटाने की भी आवश्यकता है, हालांकि, केवल जल्दी-बदलते लाइन जैसी सुविधाओं को उजागर करने के लिए। रिंगिंग कलाकृतियों से बचने के लिए, मैंने 2D गौसियन कलंक का उपयोग किया और फिर मूल से घटाया:
एकीकरण (संचयी योग) आसानी से भगोड़ा हो सकता है, जो क्षैतिज लकीरें पैदा करता है। मैंने इन्हें एक अन्य गाऊसी हाई-पास के साथ हटा दिया, लेकिन केवल इस बार क्षैतिज दिशा में:
अब रंध्र चारों ओर से सफ़ेद अंडाकार होते हैं, कुछ स्थानों पर सफ़ेद के बजाय और दूसरों में काले रंग के।
मूल:
को एकीकृत:
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 को बदलने , इस, "बढ़त पिक्सल" से बने तरह रिज दीर्घवृत्त पता लगाने के लिए हालांकि यह वास्तव में गणना और स्मृति में महंगा है इस्तेमाल किया जा सकता है, और वे सही दीर्घवृत्त तो यह एक "लापरवाही" डिटेक्टर का एक सा होना चाहिए था नहीं हैं। मैंने इसे कभी नहीं किया है, लेकिन " हूप इलिप्स डिटेक्शन " के लिए बहुत सारे Google परिणाम हैं । मैं कहूंगा कि यदि आप एक निश्चित आकार के खोज स्थान के भीतर दूसरे के अंदर एक दीर्घवृत्त का पता लगाते हैं, तो इसे एक रंध्र के रूप में गिना जाना चाहिए।
और देखें: