日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双边滤波Matlab实现The Bilateral Filter

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双边滤波Matlab实现The Bilateral Filter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:http://blog.csdn.net/lifeitengup/article/details/8902326#comments

雙邊濾波與一般的高斯濾波的不同就是:雙邊濾波既利用了位置信息<or 幾何信息——高斯濾波只用了位置信息>又利用了像素信息來定義濾波窗口的權重。


像素值越接近,權重越大。雙邊濾波會去除圖像的細節信息,又能保持邊界。


對于彩色圖像,像素值的接近與否不能使用RGB空間值,雙邊濾波的原始文獻建議使用CIE顏色空間。

代碼如下:

[plain]?view plain?copy
  • function?resultI?=?BilateralFilt2(I,d,sigma)??
  • %%%??
  • %Author:LiFeiteng??
  • %Version:1.0——灰色圖像??Time:2013/05/01??
  • %Version:1.1——灰色/彩色圖像??Time:2013/05/02??2013/05/05??
  • %d?半窗口寬度??
  • I?=?double(I);??
  • if?size(I,3)==1??
  • ????resultI?=?BilateralFiltGray(I,d,sigma);??
  • elseif?size(I,3)==3??
  • ????resultI?=?BilateralFiltColor(I,d,sigma);??
  • else???
  • ????error('Incorrect?image?size')??????
  • end??
  • end??
  • ??
  • function?resultI?=?BilateralFiltGray(I,d,sigma)??
  • ??
  • [m?n]?=?size(I);??
  • newI?=?ReflectEdge(I,d);??
  • resultI?=?zeros(m,n);??
  • width?=?2*d+1;??
  • %Distance??
  • D?=?fspecial('gaussian',[width,width],sigma(1));??
  • S?=?zeros(width,width);%pix?Similarity??
  • h?=?waitbar(0,'Applying?bilateral?filter...');??
  • set(h,'Name','Bilateral?Filter?Progress');??
  • for?i=1+d:m+d??
  • ????for?j=1+d:n+d??
  • ????????pixValue?=?newI(i-d:i+d,j-d:j+d);??
  • ????????subValue?=?pixValue-newI(i,j);??
  • ????????S?=?exp(-subValue.^2/(2*sigma(2)^2));??
  • ????????H?=?S.*D;??
  • ????????resultI(i-d,j-d)?=?sum(pixValue(:).*H(:))/sum(H(:));???
  • ????end??
  • ????waitbar(i/m);??
  • end??
  • close(h);??
  • end??
  • ??
  • function?resultI?=?BilateralFiltColor(I,d,sigma)??
  • I?=?applycform(I,makecform('srgb2lab'));??
  • [m?n?~]?=?size(I);??
  • newI?=?ReflectEdge(I,d);??
  • resultI?=?zeros(m,n,3);??
  • width?=?2*d+1;??
  • %Distance??
  • D?=?fspecial('gaussian',[width,width],sigma(1));??
  • %?[X,Y]?=?meshgrid(-d:d,-d:d);??
  • %?D?=?exp(-(X.^2+Y.^2)/(2*sigma(1)^2));??
  • S?=?zeros(width,width);%pix?Similarity??
  • h?=?waitbar(0,'Applying?bilateral?filter...');??
  • set(h,'Name','Bilateral?Filter?Progress');??
  • sigma_r?=?100*sigma(2);??
  • for?i=1+d:m+d??
  • ????for?j=1+d:n+d??
  • ????????pixValue?=?newI(i-d:i+d,j-d:j+d,1:3);??
  • ????????%subValue?=?pixValue-repmat(newI(i,j,1:3),width,width);??
  • ????????dL?=?pixValue(:,:,1)-newI(i,j,1);??
  • ????????da?=?pixValue(:,:,2)-newI(i,j,2);??
  • ????????db?=?pixValue(:,:,3)-newI(i,j,3);??
  • ????????S?=?exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));??
  • ????????H?=?S.*D;??
  • ????????H?=?H./sum(H(:));??
  • ????????resultI(i-d,j-d,1)?=?sum(sum(pixValue(:,:,1).*H));???
  • ????????resultI(i-d,j-d,2)?=?sum(sum(pixValue(:,:,2).*H));??????
  • ????????resultI(i-d,j-d,3)?=?sum(sum(pixValue(:,:,3).*H));??????
  • ????end??
  • ????waitbar(i/m);??
  • end??
  • close(h);??
  • resultI?=?applycform(resultI,makecform('lab2srgb'));??
  • end??

  • 其中newI = ReflectEdge(I,d); %對稱地擴展邊界,在原始圖像I的邊界處鏡像映射像素值?

    [plain]?view plain?copy
  • function?newI?=?ReflectEdge(I,d)??
  • %Version:1.0——灰色圖像??Time:2013/05/01??
  • %Version:1.1——灰色/彩色圖像??Time:2013/05/02??
  • %考慮到實用性,決定不添加更多的邊界處理選擇,統一使用:reflect?across?edge??
  • ??
  • if?size(I,3)==1??
  • ????newI?=?ReflectEdgeGray(I,d);??
  • elseif?size(I,3)==3??
  • ????newI?=?ReflectEdgeColor(I,d);??
  • else???
  • ????error('Incorrect?image?size')??????
  • end??
  • end??
  • ??
  • function?newI?=?ReflectEdgeGray(I,d)??
  • [m?n]?=?size(I);??
  • newI?=?zeros(m+2*d,n+2*d);??
  • %中間部分??
  • newI(d+1:d+m,d+1:d+n)?=?I;??
  • %上??
  • newI(1:d,d+1:d+n)?=?I(d:-1:1,:);??
  • %下??
  • newI(end-d:end,d+1:d+n)?=?I(end:-1:end-d,:);??
  • %左??
  • newI(:,1:d)?=?newI(:,2*d:-1:d+1);??
  • %右??
  • newI(:,n+d+1:n+2*d)?=?newI(:,n+d:-1:n+1);??
  • end??
  • ??
  • function?newI?=?ReflectEdgeColor(I,d)??
  • %擴展圖像邊界??
  • [m?n?~]?=?size(I);??
  • newI?=?zeros(m+2*d,n+2*d,3);??
  • %中間部分??
  • newI(d+1:d+m,d+1:d+n,1:3)?=?I;??
  • %上??
  • newI(1:d,d+1:d+n,1:3)?=?I(d:-1:1,:,1:3);??
  • %下??
  • newI(end-d:end,d+1:d+n,1:3)?=?I(end:-1:end-d,:,1:3);??
  • %左??
  • newI(:,1:d,1:3)?=?newI(:,2*d:-1:d+1,1:3);??
  • %右??
  • newI(:,n+d+1:n+2*d,1:3)?=?newI(:,n+d:-1:n+1,1:3);??
  • end??

  • 測試用例:

    [plain]?view plain?copy
  • img?=?imread('.\lena.tif');??
  • %%img?=?imread('.\images\lena_gray.tif');??
  • img?=?double(img)/255;??
  • img?=?img+0.05*randn(size(img));??
  • img(img<0)?=?0;?img(img>1)?=?1;??
  • %img?=?imnoise(img,'gaussian');??
  • figure,?imshow(img,[])??
  • title('原始圖像')??
  • d?=?6;??
  • sigma?=?[3?0.1];??
  • resultI?=?BilateralFilt2(double(img),?d,?sigma);??
  • ??
  • figure,?imshow(resultI,[])??
  • title('雙邊濾波后的圖像')??

  • 結果:



    Reference:

    1.C Tomasi, R Manduchi.Bilateral Filtering for Gray and Color Images,?- Computer Vision, 1998.

    雙邊濾波與一般的高斯濾波的不同就是:雙邊濾波既利用了位置信息<or 幾何信息——高斯濾波只用了位置信息>又利用了像素信息來定義濾波窗口的權重。


    像素值越接近,權重越大。雙邊濾波會去除圖像的細節信息,又能保持邊界。


    對于彩色圖像,像素值的接近與否不能使用RGB空間值,雙邊濾波的原始文獻建議使用CIE顏色空間。

    代碼如下:

    [plain]?view plain?copy
  • function?resultI?=?BilateralFilt2(I,d,sigma)??
  • %%%??
  • %Author:LiFeiteng??
  • %Version:1.0——灰色圖像??Time:2013/05/01??
  • %Version:1.1——灰色/彩色圖像??Time:2013/05/02??2013/05/05??
  • %d?半窗口寬度??
  • I?=?double(I);??
  • if?size(I,3)==1??
  • ????resultI?=?BilateralFiltGray(I,d,sigma);??
  • elseif?size(I,3)==3??
  • ????resultI?=?BilateralFiltColor(I,d,sigma);??
  • else???
  • ????error('Incorrect?image?size')??????
  • end??
  • end??
  • ??
  • function?resultI?=?BilateralFiltGray(I,d,sigma)??
  • ??
  • [m?n]?=?size(I);??
  • newI?=?ReflectEdge(I,d);??
  • resultI?=?zeros(m,n);??
  • width?=?2*d+1;??
  • %Distance??
  • D?=?fspecial('gaussian',[width,width],sigma(1));??
  • S?=?zeros(width,width);%pix?Similarity??
  • h?=?waitbar(0,'Applying?bilateral?filter...');??
  • set(h,'Name','Bilateral?Filter?Progress');??
  • for?i=1+d:m+d??
  • ????for?j=1+d:n+d??
  • ????????pixValue?=?newI(i-d:i+d,j-d:j+d);??
  • ????????subValue?=?pixValue-newI(i,j);??
  • ????????S?=?exp(-subValue.^2/(2*sigma(2)^2));??
  • ????????H?=?S.*D;??
  • ????????resultI(i-d,j-d)?=?sum(pixValue(:).*H(:))/sum(H(:));???
  • ????end??
  • ????waitbar(i/m);??
  • end??
  • close(h);??
  • end??
  • ??
  • function?resultI?=?BilateralFiltColor(I,d,sigma)??
  • I?=?applycform(I,makecform('srgb2lab'));??
  • [m?n?~]?=?size(I);??
  • newI?=?ReflectEdge(I,d);??
  • resultI?=?zeros(m,n,3);??
  • width?=?2*d+1;??
  • %Distance??
  • D?=?fspecial('gaussian',[width,width],sigma(1));??
  • %?[X,Y]?=?meshgrid(-d:d,-d:d);??
  • %?D?=?exp(-(X.^2+Y.^2)/(2*sigma(1)^2));??
  • S?=?zeros(width,width);%pix?Similarity??
  • h?=?waitbar(0,'Applying?bilateral?filter...');??
  • set(h,'Name','Bilateral?Filter?Progress');??
  • sigma_r?=?100*sigma(2);??
  • for?i=1+d:m+d??
  • ????for?j=1+d:n+d??
  • ????????pixValue?=?newI(i-d:i+d,j-d:j+d,1:3);??
  • ????????%subValue?=?pixValue-repmat(newI(i,j,1:3),width,width);??
  • ????????dL?=?pixValue(:,:,1)-newI(i,j,1);??
  • ????????da?=?pixValue(:,:,2)-newI(i,j,2);??
  • ????????db?=?pixValue(:,:,3)-newI(i,j,3);??
  • ????????S?=?exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));??
  • ????????H?=?S.*D;??
  • ????????H?=?H./sum(H(:));??
  • ????????resultI(i-d,j-d,1)?=?sum(sum(pixValue(:,:,1).*H));???
  • ????????resultI(i-d,j-d,2)?=?sum(sum(pixValue(:,:,2).*H));??????
  • ????????resultI(i-d,j-d,3)?=?sum(sum(pixValue(:,:,3).*H));??????
  • ????end??
  • ????waitbar(i/m);??
  • end??
  • close(h);??
  • resultI?=?applycform(resultI,makecform('lab2srgb'));??
  • end??

  • 其中newI = ReflectEdge(I,d); %對稱地擴展邊界,在原始圖像I的邊界處鏡像映射像素值?

    [plain]?view plain?copy
  • function?newI?=?ReflectEdge(I,d)??
  • %Version:1.0——灰色圖像??Time:2013/05/01??
  • %Version:1.1——灰色/彩色圖像??Time:2013/05/02??
  • %考慮到實用性,決定不添加更多的邊界處理選擇,統一使用:reflect?across?edge??
  • ??
  • if?size(I,3)==1??
  • ????newI?=?ReflectEdgeGray(I,d);??
  • elseif?size(I,3)==3??
  • ????newI?=?ReflectEdgeColor(I,d);??
  • else???
  • ????error('Incorrect?image?size')??????
  • end??
  • end??
  • ??
  • function?newI?=?ReflectEdgeGray(I,d)??
  • [m?n]?=?size(I);??
  • newI?=?zeros(m+2*d,n+2*d);??
  • %中間部分??
  • newI(d+1:d+m,d+1:d+n)?=?I;??
  • %上??
  • newI(1:d,d+1:d+n)?=?I(d:-1:1,:);??
  • %下??
  • newI(end-d:end,d+1:d+n)?=?I(end:-1:end-d,:);??
  • %左??
  • newI(:,1:d)?=?newI(:,2*d:-1:d+1);??
  • %右??
  • newI(:,m+d+1:m+2*d)?=?newI(:,m+d:-1:m+1);??
  • end??
  • ??
  • function?newI?=?ReflectEdgeColor(I,d)??
  • %擴展圖像邊界??
  • [m?n?~]?=?size(I);??
  • newI?=?zeros(m+2*d,n+2*d,3);??
  • %中間部分??
  • newI(d+1:d+m,d+1:d+n,1:3)?=?I;??
  • %上??
  • newI(1:d,d+1:d+n,1:3)?=?I(d:-1:1,:,1:3);??
  • %下??
  • newI(end-d:end,d+1:d+n,1:3)?=?I(end:-1:end-d,:,1:3);??
  • %左??
  • newI(:,1:d,1:3)?=?newI(:,2*d:-1:d+1,1:3);??
  • %右??
  • newI(:,m+d+1:m+2*d,1:3)?=?newI(:,m+d:-1:m+1,1:3);??
  • end??

  • 測試用例:

    [plain]?view plain?copy
  • img?=?imread('.\lena.tif');??
  • %%img?=?imread('.\images\lena_gray.tif');??
  • img?=?double(img)/255;??
  • img?=?img+0.05*randn(size(img));??
  • img(img<0)?=?0;?img(img>1)?=?1;??
  • %img?=?imnoise(img,'gaussian');??
  • figure,?imshow(img,[])??
  • title('原始圖像')??
  • d?=?6;??
  • sigma?=?[3?0.1];??
  • resultI?=?BilateralFilt2(double(img),?d,?sigma);??
  • ??
  • figure,?imshow(resultI,[])??
  • title('雙邊濾波后的圖像')??

  • 結果:



    Reference:

    1.C Tomasi, R Manduchi.Bilateral Filtering for Gray and Color Images,?- Computer Vision, 1998.

    總結

    以上是生活随笔為你收集整理的双边滤波Matlab实现The Bilateral Filter的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。