2015-10-15 4 views
5

मैं ओपनसीवी 3.0 का उपयोग कर रहा हूं और जब भी मैं एक छवि पढ़ता हूं और इसे वापस लिखता हूं तो परिणाम धोया जाता है।ओपनसीवी इम्राइट जेपीईजी छवियों के लिए धोया गया परिणाम देता है

कोड:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 
cv::imwrite("dir/result.jpg",img); 

किसी को भी इस के कारण क्या पता है?

मूल: enter image description here

परिणाम: enter image description here

+0

पढ़ने और लिखने का कोड प्रदान करें .. आप शायद इसे जेपीईजी –

+2

@ हूमहल्फावी प्लज़ कोड के रूप में लिख सकते हैं। – zindarod

+1

हानिकारक और हानि रहित संपीड़न के अंतर में आपका स्वागत है। 100% समान छवि डेटा प्राप्त करने के लिए '.png' या अन्य हानि रहित संपीड़न तकनीक के रूप में सहेजें। – Micka

उत्तर

2

आप के रूप में दिखाया गया है OpenCV Documentation of cv::imwrite संपीड़न गुणवत्ता पैरामीटर बढ़ाने की कोशिश कर सकते हैं:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 

std::vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); 
compression_params.push_back(100); 

cv::imwrite("dir/result.jpg",img, compression_params); 

मैन्युअल संपीड़न गुणवत्ता को निर्दिष्ट के बिना, 95% की गुणवत्ता लागू किया जाएगा।

लेकिन 1. आपको नहीं पता कि आपकी मूल छवि में जेपीईजी संपीड़न की गुणवत्ता क्या है (इसलिए शायद आप छवि का आकार बढ़ा सकते हैं) और 2. यह (afaik) अभी भी अतिरिक्त मामूली कलाकृतियों को पेश करेगा, क्योंकि आखिरकार यह एक है हानिकारक संपीड़न विधि।

अद्यतन आपकी समस्या संपीड़न कलाकृतियों की वजह से नहीं है, लेकिन Adobe RGB 1998 रंग प्रारूप वाली छवि के कारण दिखाई देती है। ओपनसीवी रंग मानों को उनके रूप में व्याख्या करता है, लेकिन इसके बजाय इसे "वास्तविक" आरजीबी रंग स्थान फिट करने के लिए रंग मानों को स्केल करना चाहिए। ब्राउज़र और कुछ छवि दर्शक सही ढंग से रंग प्रारूप लागू करते हैं, जबकि अन्य नहीं करते हैं (उदा। IrfanView)। मैंने सत्यापित करने के लिए जीआईएमपी का इस्तेमाल किया। जीआईएमपी का उपयोग करके आप स्टार्टअप पर रंग मूल्यों की व्याख्या कैसे कर सकते हैं, या तो अपनी वांछित या अपनी "धोया गया" छवि प्राप्त कर सकते हैं। ओपनसीवी निश्चित रूप से ऐसी चीजों की परवाह नहीं करता है, क्योंकि यह एक फोटो संपादन पुस्तकालय नहीं है, इसलिए न तो पढ़ने और न ही लेखन पर, रंग प्रारूप संभाला जाएगा।

+0

मैं वही करने की कोशिश कर रहा था जो आपने किया है। इसे देखकर: http://stackoverflow.com/questions/801054/opencv-cvsaveimage-jpeg-compression-factor – zindarod

+0

आशा करता है कि आप 'सी ++ इंटरफ़ेस' को 'सीडी इंटरफ़ेस 'के साथ' सी इंटरफ़ेस' से अधिक ' cvSaveImage' और int-array। लेकिन क्या यह आपकी समस्या का समाधान करता है? – Micka

+0

नहीं, परिणाम छवि sill धोया गया है। – zindarod

0

@Micha के रूप में टिप्पणी की:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 
cv::imwrite("dir/result.bmp",img); 

मैं हमेशा नाराज था जब mspaint.exe jpeg छडवयों के लिए भी ऐसा ही किया। विशेष रूप से स्क्रीनशॉट के लिए ... यह हर बार उन्हें बर्बाद कर दिया।

+1

अच्छी तरह से वह 'jpeg' का उपयोग करना चाह सकता है। शायद कुछ आवेदन जैसे: '1। छवि पढ़ें; 2. कुछ संचालन करें; 3. पुराने प्रारूप में सहेजें 'लेकिन @ ज़िंदारोड को यह कहना महत्वपूर्ण है कि जेपीईजी छवियों के लिए इस मामले में अतिरिक्त कलाकृतियों होंगे। यही कारण है कि जीआईएमपी आदि अपने स्वयं के छवि प्रारूप का उपयोग करते हैं और केवल निर्यात करके जेपीजी/पीएनजी/आदि बनाते हैं। – Micka

+0

@ विलियम धन्यवाद, लेकिन मिका ने कहा है, मुझे वास्तव में जेपीजी के रूप में परिणाम की आवश्यकता है। – zindarod

2

ऐसा इसलिए है क्योंकि आप छवि को जेपीजी के रूप में सहेज रहे हैं। ऐसा करने पर ओपनसीवी छवि को संपीड़ित करेगा। इसे पीएनजी या बीएमपी के रूप में सहेजने का प्रयास करें और कोई अंतर मौजूद नहीं होगा।

हालांकि, महत्वपूर्ण सवाल: मैं जेपीजी के रूप में छवि लोड कर रहा हूँ और जेपीजी के रूप में सहेजने। तो, एक अंतर कैसे है ?!

हां, ऐसा इसलिए है क्योंकि जेपीजी के लिए कई समान संपीड़न/डिकंप्रेशन एल्गोरिदम नहीं हैं।

आप प्राप्त करने के लिए में कुछ विवरण इस सवाल को देखने चाहते हैं: Reading jpg file in OpenCV vs C# Bitmap


संपादित करें: आप देख सकते हैं मैं वास्तव में यहाँ क्या मतलब है:

auto bmp(cv::imread("c:/Testing/stack.bmp")); 
cv::imwrite("c:/Testing/stack_OpenCV.jpg", bmp); 
auto jpg_opencv(cv::imread("c:/Testing/stack_OpenCV.jpg")); 

auto jpg_mspaint(cv::imread("c:/Testing/stack_mspaint.jpg")); 
cv::imwrite("c:/Testing/stack_mspaint_opencv.jpg", jpg_mspaint); 
jpg_mspaint=(cv::imread("c:/Testing/stack_mspaint_opencv.jpg")); 

cv::Mat jpg_diff; 
cv::absdiff(jpg_mspaint, jpg_opencv, jpg_diff); 
std::cout << cv::mean(jpg_diff); 

परिणाम: [0.576 9 38, 0.466718, 0.495106, 0]

+1

ऐसा लगता है कि यहां मुद्दा यह है कि एडोब जेपीईजी प्रारूप ओपनसीवी जेपीईजी प्रारूप से अलग रूप से प्रस्तुत किया जाता है। इसलिए मैंने अपना डाउनवोट और मेरी पिछली टिप्पणियां हटा दी क्योंकि यह जेपीईजी संपीड़न कलाकृतियों के बारे में नहीं है। – Miki

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