OpenCV

2011-09-30 15 views
7

साथ रेडियल कलंक हम क्षेत्र वक्रता एक डिजिटल कैमरा में एक लेंस द्वारा शुरू की के लिए सही करने के लिए चाहते हैं को लागू करें। हम इसके बजाय एक गाऊसी कलंक हम एक रेडियल कलंक की कोशिश करना चाहते हैं को लागू करने का एक digital unsharp mask उपयोग करने की योजना है, तो शार्पनिंग छवि के किनारों की ओर अधिक प्रभाव पड़ता है।OpenCV

OpenCV का उपयोग करके रेडियल ब्लर बनाने का सबसे आसान तरीका क्या है?

+0

मैं वही प्रश्न पोस्ट करने वाला था। +1 –

उत्तर

0

मुझे फ़ोटोशॉप रेडियल गति धुंध के समान कुछ में दिलचस्पी है। यदि यह भी है कि आप क्या देख रहे हैं, मुझे लगता है कि सबसे अच्छा समाधान एक सतत resize और मिश्रण (addWeighted) हो सकता है। भी remap के साथ पूरा किया जा सकता है। स्यूडोकोड, अधिक या कम:

float center_x = width/2; //or whatever 
float center_y = height/2; 
float blur = 0.02; //blur radius per pixels from center. 2px blur at 100px from center 
int iterations = 5; 

Mat mapx, mapy; 
for(int x = 0; x < width; x++) { 
    for(int y = 0; y < height; y++) { 
     mapx[x,y] = (x - center_x)/blur; 
     mapy[x,y] = (y - center_y)/blur; 
    } 
} 

Mat tmp1, tmp2; 
for(int i = 0; i < iterations; i++) { 
    remap(src, tmp1, mapx, mapy, CV_INTER_LINEAR); // enlarge 
    remap(src, tmp2, -mapx, -mapy, CV_INTER_LINEAR); // shrink 
    addWeighted(tmp1, 0.5, tmp2, 0.5, 0, src); // blend back to src 
} 
6

उपर्युक्त उत्तर निकट है लेकिन कुछ महत्वपूर्ण तत्वों को याद कर रहा है जो मुझे समझने के लिए थोड़ा सा लगा। मैं नक्शे इतना है कि वे सही ढंग से ज़ूम गणना और हटना कर रहे हैं बदल दिया है और कहा कि/उन्हें प्रत्येक स्थिति (अन्यथा आप सिर्फ एक छोटे से वर्ग को अपनी छवि remapping खत्म हो जाएगा पर x और y से घटाया। इसके अलावा, मैं बदल/धुंधला करने के लिए धुंधला अन्यथा आपके मानचित्रों में बहुत बड़ी संख्याएं होंगी और केवल सही नहीं आतीं (प्रत्येक स्थिति के बेहद बड़े गुणक)

float center_x = width/2; //or whatever 
float center_y = height/2; 
float blur = 0.002; //blur radius per pixels from center. 2px blur at 1000px from center 
int iterations = 5; 

Mat growMapx, growMapy; 
Mat shrinkMapx, shrinkMapy; 
for(int x = 0; x < width; x++) { 
    for(int y = 0; y < height; y++) { 
    growMapx[x,y] = x+((x - center_x)*blur); 
    growMapy[x,y] = y+((y - center_y)*blur); 
    shrinkMapx[x,y] = x-((x - center_x)*blur); 
    shrinkMapy[x,y] = y-((y - center_y)*blur); 
    } 
} 

Mat tmp1, tmp2; 
for(int i = 0; i < iterations; i++) { 
    remap(src, tmp1, growMapx, growMapy, CV_INTER_LINEAR); // enlarge 
    remap(src, tmp2, shrinkMapx, shrinkMapy, CV_INTER_LINEAR); // shrink 
    addWeighted(tmp1, 0.5, tmp2, 0.5, 0, src); // blend back to src 
}