2011-01-08 5 views
12

100% इसके विपरीत है और कुछ चमक कटऑफ बिंदु आम तौर पर काफी अच्छा काम करता है ई & R.SE पर पोस्ट करने के लिए छोटे उप सर्किट या समीकरणों की तस्वीरें साफ करने के लिए tweak करने के लिए समायोजन की मेरी सामान्य विधि, हालांकि कभी कभी यह काफी है कि महान नहीं है, इस छवि के साथ की तरह:रेखा रेखाचित्रों की तस्वीरों को साफ करने के लिए मुझे किस प्रोसेसिंग चरणों का उपयोग करना चाहिए?

alt text

विपरीत (या के बजाय) मैं मुझे एक और अधिक सुसंगत उत्पादन देने के लिए उपयोग कर सकते हैं के अलावा क्या अन्य तरीकों?

मुझे काफी सामान्य उत्तर की उम्मीद है, लेकिन मैं इसे छवि मैगिक और/या पीआईएल (पायथन) का उपयोग करके इसे एक स्क्रिप्ट में लागू कर दूंगा (ताकि मैं केवल फाइलों को डंप कर सकूं) ताकि यदि आपके पास उनके लिए कुछ विशिष्ट हो स्वागत होगा।

आदर्श रूप में एक बेहतर स्रोत छवि अच्छा होगा, लेकिन मैं कभी कभी कुछ पॉलिश जोड़ने के लिए अन्य लोक के चित्र पर इस का उपयोग करें।

+1

कैसे रंग के बारे में? मैं छवि प्रसंस्करण से परिचित नहीं हूं, लेकिन ऐसा लगता है जैसे आप नीले रंग के एक निश्चित अंतर के भीतर सब कुछ हटाते हैं, तो ग्रिड हटा दिया जाएगा। – Mehrdad

उत्तर

15

पहला कदम सफेद संतुलन के मुद्दों को ध्यान में रखते हुए छवि में रोशनी अंतर को बराबर करना है। यहां सिद्धांत यह है कि सीमित क्षेत्र के भीतर छवि का सबसे चमकीला हिस्सा सफेद प्रतिनिधित्व करता है। पहले से छवि को धुंधला करके हम छवि में शोर के प्रभाव को खत्म कर देते हैं।

from PIL import Image 
from PIL import ImageFilter 
im = Image.open(r'c:\temp\temp.png') 
white = im.filter(ImageFilter.BLUR).filter(ImageFilter.MaxFilter(15)) 

alt text अगले कदम आरजीबी इनपुट से एक ग्रे पैमाने पर छवि बनाने के लिए है। सफेद बिंदु पर स्केल करके हम सफेद संतुलन के मुद्दों के लिए सही हैं। इस तरह के ग्रिड की ब्लू लाइन के रूप में आर, जी, बी हम किसी भी रंग है कि एक शुद्ध ग्रे नहीं है de-जोर देना की अधिकतम लेने से। सही आकार और प्रारूप की एक छवि बनाने के लिए यहां प्रस्तुत कोड की पहली पंक्ति एक डमी है।

grey = im.convert('L') 
width,height = im.size 
impix = im.load() 
whitepix = white.load() 
greypix = grey.load() 
for y in range(height): 
    for x in range(width): 
     greypix[x,y] = min(255, max(255 * impix[x,y][0]/whitepix[x,y][0], 255 * impix[x,y][2]/whitepix[x,y][3], 255 * impix[x,y][4]/whitepix[x,y][5])) 

इन आपरेशनों का परिणाम एक छवि ज्यादातर संगत मान होते हैं और एक साधारण सीमा के माध्यम से काले और सफेद करने के लिए परिवर्तित किया जा सकता है। alt text


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

इस दृष्टिकोण से बनाना मेरे प्रयास इस के परिणामस्वरूप:

for y in range(height): 
    for x in range(width): 
     greypix[x,y] = min(255, max(255 + impix[x,y][0] - whitepix[x,y][0], 255 + impix[x,y][7] - whitepix[x,y][8], 255 + impix[x,y][9] - whitepix[x,y][10])) 

alt text

मैं एक और भी बेहतर परिणाम देने के लिए तकनीक के संयोजन पर काम कर रहा हूँ, लेकिन यह अभी भी तैयार नहीं है।

+0

"प्रतियोगिता" से बस एक टिप्पणी: आपके सुझाव और खान के बीच मुख्य अंतर यह है कि आपका उपयोग एक (गाऊशियन?) धुंध फ़िल्टर होता है जिसके बाद अधिकतम फ़िल्टर (= फैलाव) होता है। मेरा एक मोर्फोलॉजिकल ओपनिंग का उपयोग करता है, जो बड़े पैमाने पर ग्रेडियेंट को लगभग अपरिवर्तित छोड़ देता है। समस्या यह है कि पीआईएल में मॉर्फोलॉजिकल फिल्टर नहीं होते हैं (या मुझे उन्हें नहीं मिला)। – Niki

3

कैसे detecting edges? उस रेखा रेखाचित्रों को उठा लेना चाहिए।

यहाँ अपनी छवि पर सोबेल बढ़त का पता लगाने का परिणाम है:

alt text

आप तो सीमा छवि (या तो एक अनुभव निर्धारित सीमा या Ohtsu method का प्रयोग करके), आप morphological operations का उपयोग कर छवि को साफ कर सकते हैं (उदाहरण के लिए फैलाव और क्षरण)। इससे आपको टूटी/डबल लाइनों से छुटकारा पाने में मदद मिलेगी।

जैसा कि लैम्बर्ट ने इंगित किया है, यदि आप अपने परिणाम में नहीं चाहते हैं तो आप ग्रिड लाइनों से छुटकारा पाने के लिए नीले चैनल का उपयोग करके छवि को प्री-प्रोसेस कर सकते हैं।

यदि आप इसे चित्रित करने से पहले पेज को समान रूप से प्रकाश डालते हैं तो आप बेहतर परिणाम प्राप्त करेंगे (या केवल स्कैनर का उपयोग करें) क्योंकि आपको वैश्विक बनाम स्थानीय थ्रेसहोल्डिंग के बारे में चिंता करने की आवश्यकता नहीं है।

15

विभिन्न पृष्ठभूमि रोशनी को हटाने का एक आम तरीका छवि से opening छवि से "सफेद छवि" की गणना करना है।

इस नमूने सप्टक कोड में, मैं छवि के नीले चैनल का उपयोग किया है, क्योंकि पृष्ठभूमि में लाइनों इस चैनल (संपादित में कम से कम प्रमुख हैं: का उपयोग कर एक परिपत्र संरचना तत्व एक साधारण से कम दृश्य कलाकृतियों का उत्पादन बॉक्स):

src = imread('lines.png'); 
blue = src(:,:,3); 
mask = fspecial("disk",10); 
opened = imerode(imdilate(blue,mask),mask); 

परिणाम:

background_subtracted = opened-blue; 
012: opened

तो स्रोत छवि से इस घटाना

background_subtracted (इसके विपरीत उन्नत संस्करण)

अंत में, मैं सिर्फ एक निश्चित सीमा के साथ छवि binarize चाहते हैं:

binary = background_subtracted < 35; 

binary

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

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