matlab导向滤波磨皮,图像处理(七)导向滤波磨皮
導向濾波磨皮的對應文獻為:Guided Image Filtering,這個算法速度極其之快,比其他的保邊緣磨皮算法都快,甚至快上好幾倍。這個算法最初來自于何明凱的圖像去霧算法中,現在已然被應用封裝與matlab圖像處理函數庫中,可見算法堪稱經典。
看以下算法的偽代碼:
這兒算法中有大量的用到均值卷積,因此可以用快速積分圖的方法,進行簡單加速。這個算法也是一種保邊緣的濾波算法,然而它的用處遠遠不僅僅用于濾波,還有其它非常好用的功能,比如可以用于升采樣,這個感覺非常爽。在一些摳圖算法中,如果對大圖直接進行摳圖,速度非常慢,比如現在的grub cut 分割算法,這個時候我們可以對圖像進行下采樣,然后在小圖上進行摳圖,最后再進行升采樣,這樣速度就非??炝?#xff0c;這是現在一些大圖處理常用的一種思路,因此這個算法的用處可想而知。最后我把我寫代碼貼出來,以供學習,這個代碼沒有經過整理優化,只是用了快速積分圖進行加速:
float* CGuidedfiler::Guidedfiler(float*inimg,float*guidedimg,int height,int widht,int Radius,float eps)
{
int lenght=height*widht;
float*mult=new float[lenght];
float*oned=new float[lenght];
for (int i=0;i
{
mult[i]=inimg[i]*guidedimg[i];
oned[i]=1;
}
float *covmult=new float[lenght];
float *covone=new float[lenght];
FastGetAVG(covmult,mult,widht,height,Radius);
FastGetAVG(covone,oned,widht,height,Radius);
for (int i=0;i
{
covmult[i]/=covone[i];
}
delete []mult;
delete []oned;
//計算導向圖、原圖的窗口均值
float *mean_inimg=new float[lenght];
FastGetAVG(mean_inimg,inimg,widht,height,Radius);
float*mean_guideimg=new float[lenght];
FastGetAVG(mean_guideimg,guidedimg,widht,height,Radius);
for (int i=0;i
{
mean_guideimg[i]/=covone[i];
mean_inimg[i]/=covone[i];
}
//計算ak的除數
float *var_guideimg=new float[lenght];
float *sqr_guideimg=new float[lenght];
for (int i=0;i
{
sqr_guideimg[i]=guidedimg[i]*guidedimg[i];
}
FastGetAVG(var_guideimg,sqr_guideimg,widht,height,Radius);
delete []sqr_guideimg;
for (int i=0;i
{
var_guideimg[i]=var_guideimg[i]/covone[i]-mean_guideimg[i]*mean_guideimg[i];
}
//計算ak
float*a=new float[lenght];
for (int i=0;i
{
a[i]=(covmult[i]-mean_guideimg[i]*mean_inimg[i])/(var_guideimg[i]+eps);
}
//計算bk
float*b=new float[lenght];
for (int i=0;i
{
b[i]=mean_inimg[i]-a[i]*mean_guideimg[i];
}
delete []covmult;
delete []mean_guideimg;
delete []mean_inimg;
delete []var_guideimg;
float*mean_a=new float[lenght];
float*mean_b=new float[lenght];
FastGetAVG(mean_a,a,widht,height,Radius);
FastGetAVG(mean_b,b,widht,height,Radius);
for (int i=0;i
{
mean_a[i]/=covone[i];
mean_b[i]/=covone[i];
}
delete []a;
delete []b;
//輸出圖像
float *outimg=new float[lenght];
for (int i=0;i
{
outimg[i]=mean_a[i]*guidedimg[i]+mean_b[i];
}
delete []mean_a;
delete []mean_b;
return outimg;
}
然后把結果用于磨皮,測一測效果:
原圖
美圖秀秀智能磨皮
導向濾波磨皮
總的來說美圖的磨皮好像邊緣細節方面保持的不是很好,據此可以推斷,美圖的磨皮沒有用到其他膚色檢測技術,而我是結合了膚色檢測技術在里面的,所以在頭發細節方面會保持的比較好。美圖的磨皮還有:自然磨皮、快速磨皮、普通磨皮,除了普通磨皮、智能磨皮,其它的算法結合了美白技術在里面,而且美白技術好像也沒有膚色結合膚色檢測技術,好像是對全圖進行白偏色處理,感覺美圖的美白效果很差,因為我覺得美白應該是只對皮膚進行美白,而不是整幅圖像進行美白,這邊僅代表我個人觀點,如有冒犯,請聯系本人。更多資源請關注我的博客:http://blog.csdn.net/hjimce ? ? ? ? ? ? ? ? ?原創文章,版權所有,轉載請保留這兩行作者信息
總結
以上是生活随笔為你收集整理的matlab导向滤波磨皮,图像处理(七)导向滤波磨皮的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为云怎么登录
- 下一篇: 何小鹏余承东“和解”!何小鹏:“有时候误