परिचय
थ्रेसहोल्डिंग एक छवि में बुनियादी विभाजन करने के लिए एक सरल और कुशल तकनीक है, और इसे द्विअर्थी बनाने के लिए (इसे एक बाइनरी छवि में बदल दें) जहां पिक्सेल या तो हैं 0
or 1
(या 255
यदि आप उनका प्रतिनिधित्व करने के लिए पूर्णांक का उपयोग कर रहे हैं)।
आम तौर पर, आप एक छवि में साधारण पृष्ठभूमि-अग्रभूमि विभाजन करने के लिए थ्रेसहोल्डिंग का उपयोग कर सकते हैं, और यह प्रत्येक पिक्सेल के लिए एक साधारण तकनीक पर भिन्नताओं तक उबाल जाता है:
if pixel_value > threshold:
pixel_value = MAX
else:
pixel_value = 0
इस आवश्यक प्रक्रिया के रूप में जाना जाता है बाइनरी थ्रेसहोल्डिंग. अब - ऐसे कई तरीके हैं जिनसे आप इस सामान्य विचार को बदल सकते हैं, जिसमें संचालन को उलटना (स्विच करना) शामिल है >
ए के साथ साइन इन करें <
साइन), सेटिंग pixel_value
को threshold
अधिकतम मान/0 (ट्रंकटिंग के रूप में जाना जाता है) के बजाय, को रखते हुए pixel_value
खुद अगर यह ऊपर है threshold
या अगर यह नीचे है threshold
.
इन सभी को ओपनसीवी में आसानी से कार्यान्वित किया गया है:
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
… क्रमश। ये अपेक्षाकृत "बेवकूफ" तरीके हैं जिसमें वे काफी सरल हैं, छवियों में संदर्भ के लिए खाता नहीं है, इस बात का ज्ञान है कि कौन सी आकृतियाँ सामान्य हैं, आदि। इन गुणों के लिए - हमें बहुत अधिक कम्प्यूटेशनल रूप से महंगा और शक्तिशाली नियोजित करना होगा तकनीक।
अब, "भोले" तरीकों से भी - कुछ अच्छी थ्रेसहोल्ड खोजने के लिए अनुमान लगाया जा सकता है, और इनमें ओत्सु विधि और त्रिभुज विधि शामिल है:
cv2.THRESH_OTSU
cv2.THRESH_TRIANGLE
नोट: OpenCV थ्रेशोल्डिंग एक अल्पविकसित तकनीक है, और प्रकाश परिवर्तन और ग्रेडिएंट, रंग विषमता, आदि के प्रति संवेदनशील है। यह अपेक्षाकृत साफ चित्रों पर सबसे अच्छा लागू होता है, शोर को कम करने के लिए उन्हें धुंधला करने के बाद, उन वस्तुओं में बहुत अधिक रंग भिन्नता के बिना जिन्हें आप खंडित करना चाहते हैं।
एक थ्रेशोल्ड मान के साथ बुनियादी थ्रेशोल्डिंग के साथ कुछ मुद्दों को दूर करने का एक और तरीका उपयोग करना है अनुकूली थ्रेशोल्डिंग जो वैश्विक स्तर के बजाय छवि में प्रत्येक छोटे क्षेत्र पर एक सीमा मान लागू करता है।
OpenCV के साथ सरल दहलीज
ओपनसीवी के पायथन एपीआई में थ्रेसहोल्डिंग के माध्यम से किया जाता है cv2.threshold()
विधि - जो एक छवि को स्वीकार करता है (NumPy सरणी, पूर्णांकों के साथ दर्शाया गया है), थ्रेशोल्ड, अधिकतम मान और थ्रेशोल्डिंग विधि (कैसे threshold
और maximum_value
उपयोग किया जाता है):
img = cv2.imread('objects.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blurred = cv2.GaussianBlur(img, (7, 7), 0)
ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)
वापसी कोड सिर्फ लागू सीमा है:
print(f"Threshold: {ret}")
यहाँ, चूंकि दहलीज है 220
और हमने का उपयोग किया है THRESH_BINARY
विधि - ऊपर प्रत्येक पिक्सेल मान 220
तक बढ़ाया जाएगा 255
, जबकि प्रत्येक पिक्सेल मान नीचे है 220
को कम किया जाएगा 0
, एक "मास्क" के साथ एक श्वेत और श्याम छवि बनाना, अग्रभूमि वस्तुओं को कवर करना।
220 क्यों? यह जानकर कि छवि कैसी दिखती है, आप कुछ अनुमानित अनुमान लगा सकते हैं कि आप कौन सी सीमा चुन सकते हैं। व्यवहार में, आप शायद ही कभी मैन्युअल थ्रेशोल्ड सेट करना चाहेंगे, और हम एक पल में स्वचालित थ्रेशोल्ड चयन को कवर कर देंगे।
आइए परिणाम की साजिश करें! OpenCV विंडो थोड़ी बारीक हो सकती है, इसलिए हम Matplotlib का उपयोग करके मूल छवि, धुंधली छवि और परिणाम प्लॉट करेंगे:
fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)
दहलीज के तरीके
जैसा कि पहले उल्लेख किया गया है, ऐसे कई तरीके हैं जिनसे आप किसी फ़ंक्शन में थ्रेशोल्ड और अधिकतम मान का उपयोग कर सकते हैं। हमने शुरू में बाइनरी थ्रेशोल्ड पर एक नज़र डाली है। आइए विधियों की एक सूची बनाएं, और परिणामों की साजिश रचते हुए उन्हें एक-एक करके लागू करें:
methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']
def thresh(img_path, method, index):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blurred = cv2.GaussianBlur(img, (7, 7), 0)
ret, img_masked = cv2.threshold(blurred, 220, 255, method)
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
fig.suptitle(names[index], fontsize=18)
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)
plt.tight_layout()
for index, method in enumerate(methods):
thresh('coins.jpeg', method, index)
THRESH_BINARY
और THRESH_BINARY_INV
एक दूसरे के प्रतिलोम हैं, और बीच में एक छवि को द्विअर्थी बनाते हैं 0
और 255
, उन्हें क्रमशः पृष्ठभूमि और अग्रभूमि में असाइन करना, और इसके विपरीत।
THRESH_TRUNC
के बीच छवि को द्विअर्थी बनाता है threshold
और 255
.
THRESH_TOZERO
और THRESH_TOZERO_INV
के बीच द्विभाजन 0
और वर्तमान पिक्सेल मान (src(x, y)
) आइए परिणामी छवियों पर एक नज़र डालें:
सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!
ये विधियां काफी सहज हैं - लेकिन, हम एक अच्छे थ्रेशोल्ड मान को कैसे स्वचालित कर सकते हैं, और "अच्छा थ्रेशोल्ड" मान का क्या अर्थ है? अब तक के अधिकांश परिणामों में गैर-आदर्श मास्क थे, जिनमें निशान और धब्बे थे। यह सिक्कों की परावर्तक सतहों में अंतर के कारण होता है - वे समान रूप से रंगीन नहीं होते हैं क्योंकि लकीरें प्रकाश को कैसे दर्शाती हैं।
हम एक हद तक बेहतर वैश्विक दहलीज ढूंढकर इससे लड़ सकते हैं।
OpenCV के साथ स्वचालित/अनुकूलित थ्रेसहोल्डिंग
ओपनसीवी दो प्रभावी वैश्विक थ्रेशोल्ड खोज विधियों को नियोजित करता है - ओत्सु की विधि, और त्रिभुज विधि।
ओत्सु की विधि मानती है कि यह काम कर रहा है द्वि-मोडल इमेजिस। द्वि-मोडल छवियां ऐसी छवियां हैं जिनके रंग हिस्टोग्राम में केवल दो शिखर होते हैं (अर्थात केवल दो अलग-अलग पिक्सेल मान होते हैं)। यह देखते हुए कि प्रत्येक चोटियाँ "पृष्ठभूमि" और "अग्रभूमि" जैसे वर्ग से संबंधित हैं - आदर्श दहलीज उनके ठीक बीच में है।
छवि क्रेडिट: https://scipy-lectures.org/
आप गाऊसी ब्लर्स के साथ कुछ छवियों को अधिक द्वि-मोडल बना सकते हैं, लेकिन सभी नहीं।
एक वैकल्पिक, कई बार बेहतर प्रदर्शन करने वाला एल्गोरिथम त्रिभुज एल्गोरिथम है, जो ग्रे-लेवल हिस्टोग्राम के अधिकतम और न्यूनतम के बीच की दूरी की गणना करता है और एक रेखा खींचता है। जिस बिंदु पर वह रेखा शेष हिस्टोग्राम से अधिकतम दूर होती है उसे दहलीज के रूप में चुना जाता है:
ये दोनों एक ग्रेस्केल वाली छवि मानते हैं, इसलिए हमें इनपुट छवि को ग्रे के माध्यम से ग्रे में बदलने की आवश्यकता होगी cv2.cvtColor()
:
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)
masked = cv2.bitwise_and(img, img, mask=mask1)
आइए छवि को दोनों विधियों से चलाएं और परिणामों की कल्पना करें:
methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']
def thresh(img_path, method, index):
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
ret, img_masked = cv2.threshold(blurred, 0, 255, method)
print(f"Threshold: {ret}")
fig, ax = plt.subplots(1, 3, figsize=(12, 5))
fig.suptitle(names[index], fontsize=18)
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))
for index, method in enumerate(methods):
thresh('coins.jpeg', method, index)
यहां, त्रिभुज विधि ओत्सु की विधि से बेहतर प्रदर्शन करती है, क्योंकि छवि द्वि-मोडल नहीं है:
import numpy as np
img = cv2.imread('coins.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)
हालांकि, यह स्पष्ट है कि कैसे त्रिकोण विधि छवि के साथ काम करने और अधिक संतोषजनक परिणाम देने में सक्षम थी।
ओपनसीवी थ्रेसहोल्डिंग की सीमाएं
ओपनसीवी के साथ थ्रेसहोल्डिंग सरल, आसान और कुशल है। फिर भी, यह काफी सीमित है। जैसे ही आप रंगीन तत्वों, गैर-समान पृष्ठभूमि और बदलती रोशनी की स्थिति का परिचय देते हैं - एक अवधारणा के रूप में वैश्विक थ्रेशोल्डिंग बहुत कठोर हो जाती है।
छवियां आमतौर पर एक सीमा के लिए पर्याप्त होने के लिए बहुत जटिल होती हैं, और इसे आंशिक रूप से संबोधित किया जा सकता है अनुकूली थ्रेशोल्डिंग, जहां एक वैश्विक सीमा के बजाय कई स्थानीय सीमाएं लागू होती हैं। सीमित होने के बावजूद, अनुकूली थ्रेशोल्डिंग वैश्विक थ्रेशोल्डिंग की तुलना में बहुत अधिक लचीली है।
निष्कर्ष
हाल के वर्षों में, बाइनरी सेगमेंटेशन (जैसे हमने यहां क्या किया) और मल्टी-लेबल सेगमेंटेशन (जहां आपके पास एन्कोडेड कक्षाओं की एक मनमानी संख्या हो सकती है) को सफलतापूर्वक गहन शिक्षण नेटवर्क के साथ तैयार किया गया है, जो बहुत अधिक शक्तिशाली और लचीले हैं। इसके अलावा, वे वैश्विक और स्थानीय संदर्भ को उन छवियों में एन्कोड कर सकते हैं जिन्हें वे विभाजित कर रहे हैं। नकारात्मक पक्ष यह है - आपको उन्हें प्रशिक्षित करने के लिए डेटा, साथ ही समय और विशेषज्ञता की आवश्यकता है।
ऑन-द-फ्लाई, सरल थ्रेशोल्डिंग के लिए, आप OpenCV का उपयोग कर सकते हैं। सटीक, उत्पादन-स्तर विभाजन के लिए, आप तंत्रिका नेटवर्क का उपयोग करना चाहेंगे।
आगे जाना - कंप्यूटर विजन के लिए व्यावहारिक गहन शिक्षण
आपका जिज्ञासु स्वभाव आपको और आगे जाना चाहता है? हम अनुशंसा करते हैं कि हमारी जाँच करें कोर्स: "पायथन के साथ कंप्यूटर विजन के लिए प्रैक्टिकल डीप लर्निंग".
एक और कंप्यूटर विजन कोर्स?
हम MNIST अंकों या MNIST फैशन का वर्गीकरण नहीं करेंगे। उन्होंने बहुत समय पहले अपनी भूमिका निभाई थी। उन्नत ब्लैक-बॉक्स आर्किटेक्चर को प्रदर्शन का बोझ उठाने देने से पहले बहुत से सीखने के संसाधन बुनियादी डेटासेट और बुनियादी आर्किटेक्चर पर ध्यान केंद्रित कर रहे हैं।
हम पर ध्यान केंद्रित करना चाहते हैं रहस्योद्घाटन, व्यावहारिकता, समझ, अंतर्ज्ञान और वास्तविक परियोजनाएं. सीखना चाहते है कैसे आप कुछ कर सकते है? हम आपको हमारे दिमाग की छवियों को संसाधित करने से लेकर स्तन कैंसर के लिए एक शोध-ग्रेड डीप लर्निंग क्लासिफायर लिखने से लेकर गहन शिक्षण नेटवर्क तक ले जाएंगे जो "मतिभ्रम" करते हैं, आपको व्यावहारिक कार्य के माध्यम से सिद्धांत और सिद्धांत सिखाते हैं, आपको इससे लैस करते हैं कंप्यूटर विज़न को हल करने के लिए गहन शिक्षण को लागू करने में विशेषज्ञ बनने के लिए जानकारी और उपकरण।
अंदर क़या है?
- दृष्टि के पहले सिद्धांत और कंप्यूटर को "देखना" कैसे सिखाया जा सकता है
- कंप्यूटर विज़न के विभिन्न कार्य और अनुप्रयोग
- व्यापार के उपकरण जो आपके काम को आसान बना देंगे
- कंप्यूटर विज़न के लिए डेटासेट खोजना, बनाना और उपयोग करना
- दृढ़ तंत्रिका नेटवर्क का सिद्धांत और अनुप्रयोग
- डेटासेट में डोमेन शिफ्ट, सह-घटना और अन्य पूर्वाग्रहों को संभालना
- अपने लाभ के लिए सीखने और दूसरों के प्रशिक्षण समय और कम्प्यूटेशनल संसाधनों का उपयोग करना स्थानांतरित करें
- एक अत्याधुनिक स्तन कैंसर क्लासिफायर का निर्माण और प्रशिक्षण
- मुख्यधारा के विचारों पर संदेह की एक स्वस्थ खुराक कैसे लागू करें और व्यापक रूप से अपनाई गई तकनीकों के निहितार्थ को समझें
- t-SNE और PCA का उपयोग करके ConvNet के "अवधारणा स्थान" की कल्पना करना
- बेहतर परिणाम प्राप्त करने के लिए कंपनियां कंप्यूटर विज़न तकनीकों का उपयोग कैसे करती हैं, इसका केस अध्ययन
- उचित मॉडल मूल्यांकन, गुप्त स्थान विज़ुअलाइज़ेशन और मॉडल के ध्यान की पहचान करना
- डोमेन अनुसंधान करना, अपने स्वयं के डेटासेट को संसाधित करना और मॉडल परीक्षण स्थापित करना
- अत्याधुनिक वास्तुकला, विचारों की प्रगति, उन्हें क्या विशिष्ट बनाता है और उन्हें कैसे लागू किया जाए
- KerasCV - अत्याधुनिक पाइपलाइन और मॉडल बनाने के लिए WIP लाइब्रेरी
- पेपर कैसे पार्स करें और पढ़ें और उन्हें स्वयं कैसे लागू करें
- अपने आवेदन के आधार पर मॉडल का चयन
- एंड-टू-एंड मशीन लर्निंग पाइपलाइन बनाना
- तेजी से आर-सीएनएन, रेटिनानेट्स, एसएसडी और योलो के साथ ऑब्जेक्ट डिटेक्शन पर लैंडस्केप और अंतर्ज्ञान
- इंस्टेंस और सिमेंटिक सेगमेंटेशन
- YOLOv5 . के साथ रीयल-टाइम ऑब्जेक्ट रिकग्निशन
- YOLOv5 ऑब्जेक्ट डिटेक्टरों का प्रशिक्षण
- KerasNLP (उद्योग-शक्ति WIP पुस्तकालय) का उपयोग कर ट्रांसफॉर्मर के साथ कार्य करना
- छवियों के कैप्शन उत्पन्न करने के लिए ट्रांसफॉर्मर को कन्वनेट के साथ एकीकृत करना
- DeepDream
- कंप्यूटर विज़न के लिए डीप लर्निंग मॉडल ऑप्टिमाइज़ेशन