2011-09-30 4 views
7

Dijital fotoğraf makinesinde bir objektif tarafından tanıtılan alan eğriliğini düzeltmek istiyoruz. Bir digital unsharp mask kullanmayı planlıyoruz Bir Gauss bulanıklığı uygulamak yerine, radyal bulanıklığı denemek istiyoruz, böylece keskinleştirmenin görüntünün kenarlarına daha fazla etkisi oluyor.OpenCV ile radyal bulanıklık uygulayın

OpenCV kullanarak radyal bulanıklık oluşturmanın en kolay yolu nedir?

+0

Ben aynı soruyu yayınlamak üzereydi. +1 –

cevap

0

Photoshop radyal hareket bulanıklığına benzer bir şeyle ilgileniyorum. Bu sizin de aradığınız şey ise, en iyi çözümün yinelenen bir resize ve karışım (addWeighted) olabileceğini düşünüyorum. remap ile de yapılabilir. Sözdekod az ya da çok:

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

yanıt yukarıda yakın ama anlamaya bana biraz aldı, birkaç temel unsurları eksik olduğunu. Haritaları değiştirerek yakınlaştırma ve küçülmeyi doğru bir şekilde hesapladım ve her bir konumdaki x ve y'den ekleyip çıkartacağım (aksi takdirde görüntünüzü küçük bir kareye yeniden eşleştireceksiniz. * Haritalarınızın çok sayıda içeren ve sadece doğru (her pozisyonun çok büyük katlarını) dışarı çıkmıyor aksi bulanıklaşmaya bulanıklık.

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 
}