2012-10-29 16 views
7

मुझे पता है कि ओपनसीवी केवल बाइनरी मास्क का समर्थन करता है।
लेकिन मुझे एक ओवरले करने की आवश्यकता है जहां मेरे पास ग्रेस्केल मास्क है जो ओवरले की पारदर्शिता निर्दिष्ट करता है।ओपनसीवी में अल्फा मास्क करने का सबसे प्रभावी तरीका कौन सा है?

उदा। यदि मास्क में एक पिक्सेल 50% सफेद है तो इसका मतलब cv::addWeighted उस पिक्सेल के लिए अल्फा = बीटा = 0.5, गामा = 0.0 के साथ ऑपरेशन होना चाहिए।

अब, यदि कोई ओपनसीवी लाइब्रेरी फ़ंक्शन नहीं है, तो आप सबसे कुशल के रूप में क्या एल्गोरिदम सुझाएंगे?

उत्तर

5

मैंने ठीक करने के लिए ऐसा कुछ किया है।

typedef double Mask_value_t; 
typedef Mat_<Mask_value_t> Mask; 
void cv::addMasked(const Mat& src1, const Mat& src2, const Mask& mask, Mat& dst) 
{ 
    MatConstIterator_<Vec3b> it1 = src1.begin<Vec3b>(), it1_end = src1.end<Vec3b>(); 
    MatConstIterator_<Vec3b> it2 = src2.begin<Vec3b>(); 
    MatConstIterator_<Mask_value_t> mask_it = mask.begin(); 
    MatIterator_<Vec3b> dst_it = dst.begin<Vec3b>(); 

    for(; it1 != it1_end; ++it1, ++it2, ++mask_it, ++dst_it) 
    *dst_it = (*it1) * (1.0-*mask_it) + (*it2) * (*mask_it); 
} 

मैंने अभी तक इस कोड को अनुकूलित नहीं किया है और न ही इस कोड को सुरक्षित किया है।
कार्य धारणाएं: सभी मैट और मास्क एक ही आकार के हैं और मैट सामान्य तीन चैनल रंग छवियां हैं।

-1

ओपनसीवी आरजीबीए छवियों का समर्थन करता है जिसे आप mixchannels या split और merge फ़ंक्शन का उपयोग करके अपनी छवियों को अपने ग्रेस्केल मास्क के साथ जोड़कर बना सकते हैं। मुझे आशा है कि यह वही है जो आप खोज रहे हैं!

इस विधि का उपयोग तुम इतनी तरह अपनी छवि के साथ अपने ग्रेस्केल मुखौटा गठजोड़ कर सकते हैं:

cv::Mat gray_image, mask, rgba_image; 
    std::vector<cv::Mat> result; 
    cv::Mat image = cv::imread(image_path); 
    cv::split(image, result); 
    cv::cvtColor(image, gray_image, CV_BGR2GRAY); 
    cv::threshold(gray_image, mask, 128, 255, CV_THRESH_BINARY); 
    result.push_back(mask); 
    cv::merge(result, rgba_image); 
    imwrite("rgba.png", rgba_image); 

ध्यान रखें कि आप cv::imshowread-rgba-image-opencv में वर्णित के रूप में प्रयोग RGBA छवियों को देखने नहीं कर सकता रखें और आप के बाद से jpeg के रूप में अपनी छवि को नहीं बचा सकता वह प्रारूप पारदर्शिता का समर्थन नहीं करता है। ऐसा लगता है कि आप cv::cvtcolor का उपयोग कर चैनलों को जोड़ सकते हैं जैसा कि opencv-2-3-convert-mat-to-rgba-pixel-array

+1

धन्यवाद, लेकिन क्या होता है अगर मैं एक दूसरे के ऊपर पर एक RGBA चित्र डाल? क्या यह अल्फा चैनल के अनुसार ऊपरी-एक की पारदर्शिता समायोजित करता है? –

+0

मैंने cv :: addWeighted जैसे कुछ का उपयोग करके दो आरजीबीए छवियों को संयोजित करने की कोशिश नहीं की है, लेकिन मुझे लगता है कि यह समीकरण के अनुसार काम करेगा: dst = saturate (src1 * alpha + src2 * beta + gamma)। – cwadding

3

मुझे एक ही समस्या है, जहां मैं पारदर्शिता के साथ एक पीएनजी लागू करना चाहता था। मेरे समाधान चटाई भाव उपयोग कर रहा था:

void AlphaBlend(const Mat& imgFore, Mat& imgDst, const Mat& alpha) 
{ 
    vector<Mat> vAlpha; 
    Mat imgAlpha3; 
    for(int i = 0; i < 3; i++) vAlpha.push_back(alpha); 
    merge(vAlpha,imgAlpha3) 

    Mat blend = imgFore.mul(imgAlpha3,1.0/255) + 
       imgDst.mul(Scalar::all(255)-imgAlpha3,1.0/255); 
    blend.copyTo(imgDst); 
}