2010-03-27 8 views
27

समस्याएक डिजिटल फोटो में, मैं कैसे पता लगा सकता हूं कि पहाड़ बादलों से अस्पष्ट है या नहीं?

मैं जापान में a mountain के डिजिटल तस्वीरों की एक संग्रह है। हालांकि पहाड़ अक्सर बादलों या धुंध से अस्पष्ट होता है।

छवि का पता लगाने के लिए मैं किन तकनीकों का उपयोग कर सकता हूं? मैं वर्तमान में Imager मॉड्यूल के साथ पर्ल का उपयोग कर रहा हूं, लेकिन विकल्पों के लिए खुला हूं।

सभी छवियों को एक ही स्थिति से लिया जाता है - ये कुछ नमूने हैं।

Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg

मेरे भोली समाधान

मैं पहाड़ शंकु के कई क्षैतिज पिक्सेल नमूने लेने और आसमान से अन्य नमूनों के लिए चमक मूल्यों की तुलना द्वारा शुरू कर दिया। यह अच्छी छवि 1 और खराब छवि को अलग करने के लिए अच्छा काम करता है 2.

हालांकि शरद ऋतु में यह बर्फबारी हुई और पहाड़ आकाश की तुलना में चमकदार हो गया, जैसे छवि 3, और मेरा सरल चमक परीक्षण विफल होना शुरू हो गया।

छवि 4 किनारे के मामले का एक उदाहरण है। मैं इसे एक अच्छी छवि के रूप में वर्गीकृत करूंगा क्योंकि कुछ पहाड़ स्पष्ट रूप से दिखाई दे रहे हैं।

UPDATE 1

सुझाव के लिए धन्यवाद - मुझे खुशी है कि तुम सब बेहद मेरी योग्यता का अनुमान ओवर-द हूँ।

उत्तरों के आधार पर, मैंने ImageMagick edge-detect परिवर्तन की कोशिश करना शुरू कर दिया है, जो मुझे विश्लेषण करने के लिए एक बहुत ही सरल छवि देता है।

convert sample.jpg -edge 1 edge.jpg 

Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg

मुझे लगता है मैं पेड़ों से छुटकारा और बादलों के सबसे करने के लिए मास्किंग किसी तरह का उपयोग करना चाहिए।

एक बार मेरे पास मुखौटा छवि हो जाने के बाद, समानता की तुलना 'अच्छी' छवि से करने का सबसे अच्छा तरीका क्या है? मुझे लगता है कि इस काम के लिए उपयुक्त "compare" आदेश? मैं इससे एक संख्यात्मक 'समानता' मूल्य कैसे प्राप्त करूं?

अद्यतन 2

मुझे लगता है कि मैंने कहीं convolve साथ हो रही हो सकता है।

मैंने एक अच्छी छवि पर किनारे का पता लगाकर अपनी 'कर्नेल' छवि (नीचे दी गई छवि का शीर्ष) बनाया है। फिर मैंने पहाड़ की रूपरेखा के चारों ओर सभी 'शोर' को काला कर दिया और फिर इसे फसल कर दिया।

मैं तो निम्न कोड का प्रयोग किया:

use Image::Magick; 

# Edge detect the test image 
my $test_image = Image::Magick->new; 
$test_image->Read($ARGV[0]); 
$test_image->Quantize(colorspace=>'gray'); 
$test_image->Edge(radius => 1); 

# Load the kernel 
my $kernel_image = Image::Magick->new; 
$kernel_image->Read('kernel-crop.jpg'); 

# Convolve and show the result 
$kernel_image->Convolve(coefficients => [$test_image->GetPixels()]); 
$kernel_image->Display(); 

मैं विभिन्न नमूना छवियों के लिए इस भाग गया, और नीचे के रूप में (convolved छवि प्रत्येक नमूने नीचे दिखाया गया है) मैं परिणाम मिल गया:

(माफ करना - आखिरी बार से विभिन्न नमूना छवियों!)

alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg

अब मैं यों के लिए कैसे 'चोटी वाला' एक छवि है कोशिश कर रहा हूँ। मैं छवि औसत चमक लेने की कोशिश की:

$kernel_image->Scale('1x1'); 
die $kernel_image->GetPixel(x=>1,y=>1)[0]; 

लेकिन यह सार्थक मूल्यों (0.0165, 0.0175 और 0.0174) नहीं देता है देता है। कोई बेहतर तरीका?

+4

+1 बहुत अच्छी तरह से प्रस्तुत प्रश्न – msw

+1

आप अपनी क्षमता को कम करके आंका रहे हैं। मार्सेलो ने सुझाव दिया कि संकल्प के माध्यम से समानता माप की एक डिग्री पैदा करने के लिए अद्यतन 1 में "तुलना" करने के लिए उस लिंक के बहुत से अच्छे दृष्टिकोण हैं। मुझे आशा है कि आप उन लोगों के साथ झुका रहे हैं जैसे मैं टाइप करता हूं। – msw

उत्तर

9

मुझे लगता है कि आप बहुत कम स्तर पर काम कर रहे हैं। एक किनारे का पता लगाने फ़िल्टर के माध्यम से एक त्वरित पास छवि सेट को बहुत स्पष्ट रूप से विभाजित करता है (1, 3) और (2, 4)। विशेष रूप से यदि ये छवियां एक निश्चित कैमरा व्यूपॉइंट से आती हैं, तो प्रोटोटाइपिकल आकृति के खिलाफ एक मैच ढूंढना (1) अपेक्षाकृत आसान एल्गोरिदमिक होगा। यहां तक ​​कि आपका मामला भी (4) आपको आंशिक मिलान का एक डोमेन दे सकता है जिसे आप दृढ़ता से निर्धारित कर सकते हैं कि विचार करने के लिए पर्याप्त पहाड़ था या नहीं।

+0

धन्यवाद - मैंने किनारे का पता लगाने के साथ खेलना शुरू कर दिया है और सवाल को अद्यतन किया है। अभी भी कितना पहाड़ है यह मापने के लिए थोड़ा फंस गया। –

4

उत्तर इस बात पर निर्भर करता है कि समस्या कितनी विशिष्ट है। यदि यह एक ही पीओवी से एक ही पहाड़ है, एक ज्ञात अच्छी छवि के खिलाफ दौड़ और किनारे का पता लगाने, और कॉर्पस से किनारे से पता चला छवियों के खिलाफ घूमने के लिए आधार रेखा के रूप में इसका उपयोग करें। यदि यह केवल उस पर्वत का किनारा है जिसमें आप रुचि रखते हैं, तो बेसलाइन से मैन्युअल रूप से अन्य सुविधाएं हटा दें।

+1

धन्यवाद। सौभाग्य से समस्या बहुत विशिष्ट है - पीओवी तय है। एज डिटेक्शन शुरू करने के लिए सही जगह प्रतीत होता है। मैं घुलनशील भाग के बारे में थोड़ा अनिश्चित हूँ। –

+0

(देरी प्रतिक्रिया के लिए खेद है; अलग-अलग समय क्षेत्र।) दो छवियों का संकल्प स्पाइक प्रदर्शित करेगा जो किसी प्रकार की समानता को इंगित करता है। यदि आप सभी जानना चाहते हैं कि पहाड़ का पर्याप्त दृश्य दिखाई दे रहा है, तो उस छवि के बीच संकल्प की गणना करें जिसमें केवल पहाड़ के किनारे और जिस छवि का आप परीक्षण कर रहे हैं। छवि के केंद्र के पास एक मजबूत स्पाइक सभी बताएगा। –

5

कुछ विशिष्ट सुझाव, क्या आप पहले से ही मिल गया है पर निर्माण:

  1. अपने सबसे अच्छे छवि (छवि 1 की तरह कुछ) एमएस ले लो, बढ़त का पता लगाने के माध्यम से चलाने के लिए, किसी भी ग्राफिक संपादक में परिणाम खोलते हैं (पेंट करेंगे) और पर्वत की शीर्ष सीमा ("चीनी टोपी" रेखा) को छोड़कर सब कुछ साफ करें। यह आप संकल्प कर्नेल है। अगले चरण में कुछ समय बचाने के लिए आप ऊपर और नीचे से इसे (आकार बदलना नहीं!) फसल कर सकते हैं।
  2. कुछ छवियों के साथ कर्नेल को दृढ़ करने के लिए पर्लमैजिक से Convolve फ़ंक्शन का उपयोग करें (आप पर्ल और छवि मैगिक के साथ पहले से ही सहज महसूस करते हैं)। परिणामी छवि पर आपको कर्नेल की "सही" स्थिति (छवि में पहाड़ के साथ मिलकर) के अनुरूप एक तेज स्पाइक देखना चाहिए।
  3. पहाड़ बेहतर दिखाई देने पर इस स्पाइक की सापेक्ष (आसपास के शोर के स्तर तक) ऊंचाई अधिक होगी। कई प्रतिनिधि छवियों को ले कर आप एक थ्रेसहोल्ड निर्धारित करने में सक्षम हो सकते हैं जो बुरे लोगों से अच्छी छवियों को अलग करेगा।
  4. जो कुछ भी आप करते हैं, वहां झूठी सकारात्मक और झूठी नकारात्मकताएं होंगी। तैयार रहो।
+0

चरण-दर-चरण मार्गदर्शिका के लिए धन्यवाद। यह उस स्तर के लिए वास्तव में सहायक है जो मैं हूं। हालांकि मैं थोड़ा अनिश्चित हूं कि चरण 2 कैसे काम करता है - मैं 'कर्नेल' छवि को कनवॉल फ़ंक्शन में कैसे पास करूं - ऐसा लगता है कि यह केवल गुणांक का मैट्रिक्स लेता है? –

+0

@ गैविन: कर्नेल == मैट्रिक्स।मैंने आपके लिए ऑनलाइन रूपांतरणों के कुछ उपयुक्त स्पष्टीकरण खोजने की कोशिश की है, लेकिन कुछ भी नहीं मिला - शायद आपको खुद को आजमाएं। – AVB

+0

अधिक हैकिंग के बाद, मैंने $ test_image-> GetPixels() को गुणांक के रूप में उपयोग किया - क्या यह मान्य है? मैंने फिर से पोस्ट अपडेट किया। –

संबंधित मुद्दे

 संबंधित मुद्दे