कंप्यूटर विज़न में छवि संपीड़न एक महत्वपूर्ण तकनीक है जो हमें दृश्य गुणवत्ता बनाए रखते हुए छवियों को अधिक कुशलता से संग्रहीत और प्रसारित करने की अनुमति देती है। आदर्श रूप से, हम सर्वोत्तम गुणवत्ता वाली छोटी फ़ाइलें रखना पसंद करेंगे। हालाँकि, हमें समझौता करना होगा और निर्णय लेना होगा कि कौन सा अधिक महत्वपूर्ण है।
यह ट्यूटोरियल सिद्धांत और व्यावहारिक अनुप्रयोगों को कवर करते हुए ओपनसीवी के साथ छवि संपीड़न सिखाएगा। अंत तक, आप समझ जाएंगे कि कंप्यूटर विज़न प्रोजेक्ट (या आपके पास मौजूद किसी भी अन्य प्रोजेक्ट) के लिए फ़ोटो को सफलतापूर्वक कैसे संपीड़ित किया जाए।
छवि संपीड़न दृश्य गुणवत्ता के स्वीकार्य स्तर को बनाए रखते हुए छवि के फ़ाइल आकार को कम कर रहा है। संपीड़न के दो मुख्य प्रकार हैं:
यदि "डिस्क स्थान सस्ता है," जैसा कि हम अक्सर सुनते हैं, तो छवियों को संपीड़ित क्यों करें? छोटे पैमाने पर, छवि संपीड़न ज्यादा मायने नहीं रखता, लेकिन बड़े पैमाने पर, यह महत्वपूर्ण है।
उदाहरण के लिए, यदि आपकी हार्ड ड्राइव पर कुछ छवियां हैं, तो आप उन्हें संपीड़ित कर सकते हैं और कुछ मेगाबाइट डेटा बचा सकते हैं। जब हार्ड ड्राइव को टेराबाइट्स में मापा जाता है तो इसका अधिक प्रभाव नहीं पड़ता है। लेकिन क्या होगा यदि आपकी हार्ड ड्राइव पर 100,000 छवियां हों? कुछ बुनियादी संपीड़न वास्तविक समय और पैसा बचाता है। प्रदर्शन के दृष्टिकोण से, यह वैसा ही है। यदि आपके पास बहुत सारी छवियों वाली वेबसाइट है और प्रतिदिन 10,000 लोग आपकी वेबसाइट पर आते हैं, तो संपीड़न मायने रखता है।
यहां बताया गया है कि हम ऐसा क्यों करते हैं:
छवि संपीड़न तकनीक दो प्रकार की अतिरेक का फायदा उठाती है:
स्थानिक अतिरेक इस तथ्य का लाभ उठाता है कि अधिकांश प्राकृतिक छवियों में पड़ोसी पिक्सेल का मान समान होता है। यह सहज परिवर्तन बनाता है. कई तस्वीरें "वास्तविक लगती हैं" क्योंकि एक क्षेत्र से दूसरे क्षेत्र तक प्राकृतिक प्रवाह होता है। जब पड़ोसी पिक्सेल के मान अत्यधिक भिन्न होते हैं, तो आपको "शोर" वाली छवियां मिलती हैं। पिक्सेल को एक ही रंग में समूहित करके उन बदलावों को कम "सुचारू" बनाने के लिए पिक्सेल बदल दिए गए, जिससे छवि छोटी हो गई।
रंग अतिरेक, दूसरी ओर, इस बात पर ध्यान केंद्रित करता है कि किसी छवि में आसन्न क्षेत्र अक्सर समान रंग कैसे साझा करते हैं। नीले आकाश या हरे मैदान के बारे में सोचें - छवि के बड़े हिस्से में बहुत समान रंग मान हो सकते हैं। जगह बचाने के लिए उन्हें एक साथ समूहीकृत किया जा सकता है और एक ही रंग में बनाया जा सकता है।
OpenCV इन विचारों के साथ काम करने के लिए ठोस उपकरण प्रदान करता है। स्थानिक अतिरेक का उपयोग करते हुए, OpenCV का cv2.inpaint() फ़ंक्शन, उदाहरण के लिए, आस-पास के पिक्सेल से जानकारी का उपयोग करके चित्र के लापता या क्षतिग्रस्त क्षेत्रों को भरता है। OpenCV डेवलपर्स को रंग अतिरेक के संबंध में कई रंग स्थानों के बीच छवियों का अनुवाद करने के लिए cv2.cvtColor() का उपयोग करने देता है। यह कई संपीड़न तकनीकों में प्रीप्रोसेसिंग चरण के रूप में कुछ हद तक सहायक हो सकता है क्योंकि कुछ रंग स्थान विशेष प्रकार की छवियों को एन्कोड करने में दूसरों की तुलना में अधिक प्रभावी होते हैं।
अब हम इस सिद्धांत में से कुछ का परीक्षण करेंगे। आइए इसके साथ खेलें.
आइए जानें कि ओपनसीवी के पायथन बाइंडिंग का उपयोग करके छवियों को कैसे संपीड़ित किया जाए। इस कोड को लिखें या कॉपी करें:
आप यहां स्रोत कोड भी प्राप्त कर सकते हैं
import cv2 import numpy as np def compress_image(image_path, quality=90): # Read the image img = cv2.imread(image_path) # Encode the image with JPEG compression encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality] _, encoded_img = cv2.imencode('.jpg', img, encode_param) # Decode the compressed image decoded_img = cv2.imdecode(encoded_img, cv2.IMREAD_COLOR) return decoded_img # Example usage original_img = cv2.imread('original_image.jpg') compressed_img = compress_image('original_image.jpg', quality=50) # Display results cv2.imshow('Original', original_img) cv2.imshow('Compressed', compressed_img) cv2.waitKey(0) cv2.destroyAllWindows() # Calculate compression ratio original_size = original_img.nbytes compressed_size = compressed_img.nbytes compression_ratio = original_size / compressed_size print(f"Compression ratio: {compression_ratio:.2f}")
इस उदाहरण में एक कॉम्प्रेस_इमेज फ़ंक्शन शामिल है जो दो पैरामीटर लेता है:
फिर, हम मूल छवि को basic_img में लोड करेंगे। फिर हम उसी छवि को 50% तक संपीड़ित करते हैं और इसे एक नए उदाहरण, संपीड़ित_इमेज में लोड करते हैं।
फिर हम मूल और संपीड़ित छवियां दिखाएंगे ताकि आप उन्हें एक साथ देख सकें।
फिर हम संपीड़न अनुपात की गणना और प्रदर्शन करते हैं।
यह उदाहरण दर्शाता है कि OpenCV में JPEG संपीड़न का उपयोग करके किसी छवि को कैसे संपीड़ित किया जाए। गुणवत्ता पैरामीटर फ़ाइल आकार और छवि गुणवत्ता व्यापार को नियंत्रित करता है।
आइए इसे चलाएं:
शुरुआत में छवियों को देखने पर, आपको थोड़ा अंतर दिखाई देता है। हालाँकि, ज़ूम इन करने पर आपको गुणवत्ता में अंतर दिखाई देता है:
और विंडोज़ बंद करने और फ़ाइलों को देखने के बाद, हम देख सकते हैं कि फ़ाइल का आकार नाटकीय रूप से कम हो गया था:
इसके अलावा, अगर हम इसे और कम करते हैं, तो हम अपनी गुणवत्ता को 10% तक बदल सकते हैं
compressed_img = compress_image('sampleimage.jpg', quality=10)
और परिणाम बहुत अधिक कठोर हैं:
और फ़ाइल आकार के परिणाम भी अधिक कठोर हैं:
आप इन मापदंडों को काफी आसानी से समायोजित कर सकते हैं और गुणवत्ता और फ़ाइल आकार के बीच वांछित संतुलन प्राप्त कर सकते हैं।
संपीड़न के प्रभाव का आकलन करने के लिए, हम जैसे मैट्रिक्स का उपयोग कर सकते हैं:
मीन स्क्वायर्ड एरर (एमएसई) मापता है कि दो छवियां एक-दूसरे से कितनी भिन्न हैं। जब आप किसी छवि को संपीड़ित करते हैं, तो एमएसई आपको यह निर्धारित करने में मदद करता है कि मूल की तुलना में संपीड़ित छवि कितनी बदल गई है।
यह दो छवियों में संबंधित पिक्सेल के रंगों के बीच अंतर का नमूना लेकर, उन अंतरों का वर्ग करके और उनका औसत निकालकर ऐसा करता है। परिणाम एक एकल संख्या है: कम एमएसई का मतलब है कि संपीड़ित छवि मूल के करीब है। इसकी तुलना में, उच्च एमएसई का मतलब है कि गुणवत्ता में अधिक ध्यान देने योग्य हानि है।
इसे मापने के लिए यहां कुछ पायथन कोड दिया गया है:
def calculate_mse(img1, img2): return np.mean((img1 - img2) ** 2) mse = calculate_mse(original_img, compressed_img) print(f"Mean Squared Error: {mse:.2f}")
हमारी डेमो छवि संपीड़न इस प्रकार दिखती है:
पीक सिग्नल-टू-शोर अनुपात (पीएसएनआर) एक माप है जो दर्शाता है कि संपीड़न के बाद छवि की गुणवत्ता कितनी खराब हो गई है। यह अक्सर आपकी आँखों से दिखाई देता है, लेकिन यह एक निर्धारित मान निर्दिष्ट करता है। यह मूल छवि की तुलना संपीड़ित छवि से करता है और अंतर को अनुपात के रूप में व्यक्त करता है।
उच्च पीएसएनआर मान का मतलब है कि संपीड़ित छवि गुणवत्ता में मूल के करीब है, जो गुणवत्ता में कम हानि का संकेत देती है। कम पीएसएनआर का अर्थ है अधिक दृश्यमान गिरावट। पीएसएनआर का उपयोग अक्सर एमएसई के साथ किया जाता है, पीएसएनआर व्याख्या करने में आसान पैमाना प्रदान करता है जहां उच्चतर बेहतर होता है।
यहां कुछ पायथन कोड है जो मापता है:
def calculate_psnr(img1, img2): mse = calculate_mse(img1, img2) if mse == 0: return float('inf') max_pixel = 255.0 return 20 * np.log10(max_pixel / np.sqrt(mse)) psnr = calculate_psnr(original_img, compressed_img) print(f"PSNR: {psnr:.2f} dB")
हमारी डेमो छवि संपीड़न इस प्रकार दिखती है:
गुणवत्ता निर्धारित करने के लिए संपीड़न के बाद अपनी छवियों पर "आंखें घुमाना" ठीक है; हालाँकि, बड़े पैमाने पर, स्क्रिप्ट का ऐसा करना मानकों को निर्धारित करने और यह सुनिश्चित करने का एक बहुत आसान तरीका है कि छवियां उनका पालन करती हैं।
आइए कुछ अन्य तकनीकों पर नजर डालें:
अधिक उन्नत संपीड़न के लिए, ओपनसीवी विभिन्न एल्गोरिदम का समर्थन करता है:
आप अपनी छवियों को पीएनजी प्रारूप में परिवर्तित कर सकते हैं, जिसके कई फायदे हैं। कोड की निम्नलिखित पंक्ति का उपयोग करें, और आप अपनी आवश्यकताओं के आधार पर अपना संपीड़न 0 से 9 तक सेट कर सकते हैं। 0 का अर्थ है कोई भी संपीड़न नहीं, और 9 अधिकतम है। ध्यान रखें कि पीएनजी एक "दोषरहित" प्रारूप है, इसलिए अधिकतम संपीड़न पर भी, छवि बरकरार रहनी चाहिए। बड़ा समझौता फ़ाइल आकार और संपीड़न समय है।
ओपनसीवी के साथ पीएनजी संपीड़न का उपयोग करने के लिए कोड यहां दिया गया है:
cv2.imwrite('compressed.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 9])
और यहां हमारा परिणाम है:
नोट: आप कभी-कभी देख सकते हैं कि पीएनजी फ़ाइलें वास्तव में आकार में बड़ी होती हैं, जैसा कि इस मामले में है। यह छवि की सामग्री पर निर्भर करता है।
आप अपनी छवियों को .webp प्रारूप में भी परिवर्तित कर सकते हैं। यह संपीड़न की एक नई विधि है जो लोकप्रियता प्राप्त कर रही है। मैं वर्षों से अपने ब्लॉग पर छवियों पर इस संपीड़न का उपयोग कर रहा हूं।
निम्नलिखित कोड में, हम अपनी छवि को एक वेबपी फ़ाइल में लिख सकते हैं और संपीड़न स्तर को 0 से 100 तक सेट कर सकते हैं। यह पीएनजी के पैमाने के विपरीत है क्योंकि 0, क्योंकि हम इसके बजाय गुणवत्ता सेट कर रहे हैं संपीड़न। यह छोटा सा अंतर मायने रखता है, क्योंकि 0 की सेटिंग सबसे कम संभव गुणवत्ता है, जिसमें फ़ाइल का आकार छोटा होता है और महत्वपूर्ण हानि होती है। 100 उच्चतम गुणवत्ता है, जिसका अर्थ है सर्वोत्तम छवि गुणवत्ता वाली बड़ी फ़ाइलें।
ऐसा करने के लिए यहां पायथन कोड है:
cv2.imwrite('compressed.webp', img, [cv2.IMWRITE_WEBP_QUALITY, 80])
और यहां हमारा परिणाम है:
ये दो तकनीकें बड़ी मात्रा में डेटा को संपीड़ित करने के लिए बहुत अच्छी हैं। आप हजारों या सैकड़ों हजारों छवियों को स्वचालित रूप से संपीड़ित करने के लिए स्क्रिप्ट लिख सकते हैं।
छवि संपीड़न शानदार है। यह कई मायनों में कंप्यूटर विज़न कार्यों के लिए आवश्यक है, विशेष रूप से स्थान बचाने या प्रसंस्करण गति बढ़ाने के लिए। जब भी आप हार्ड ड्राइव स्थान कम करना चाहते हैं या बैंडविड्थ बचाना चाहते हैं तो कंप्यूटर विज़न के बाहर भी कई उपयोग के मामले हैं। छवि संपीड़न से बहुत मदद मिल सकती है.
इसके पीछे के सिद्धांत को समझकर और इसे लागू करके, आप अपनी परियोजनाओं के साथ कुछ शक्तिशाली चीजें कर सकते हैं।
याद रखें, प्रभावी संपीड़न की कुंजी फ़ाइल आकार में कमी और आपके एप्लिकेशन के लिए स्वीकार्य दृश्य गुणवत्ता बनाए रखने के बीच सही स्थान ढूंढना है।
पढ़ने के लिए धन्यवाद, और यदि आपके पास कोई टिप्पणी या प्रश्न हो तो बेझिझक संपर्क करें!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3