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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

域滤波:方框、高斯、中值、双边滤波

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 域滤波:方框、高斯、中值、双边滤波 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鄰域?yàn)V波(卷積)


鄰域算子值利用給定像素周?chē)袼氐闹禌Q定此像素的最終輸出。如圖左邊圖像與中間圖像卷積禪城右邊圖像。目標(biāo)圖像中綠色的像素由原圖像中藍(lán)色標(biāo)記的像素計(jì)算得到。


通用線性鄰域?yàn)V波是一種常用的鄰域算子,輸入像素加權(quán)得到輸出像素:


其中權(quán)重核???為“濾波系數(shù)”。上面的式子可以簡(jiǎn)記為:



【方框?yàn)V波】

最簡(jiǎn)單的線性濾波是移動(dòng)平均或方框?yàn)V波,用?窗口中的像素值平均后輸出,核函數(shù)為:

其實(shí)等價(jià)于圖像與全部元素值為1的核函數(shù)進(jìn)行卷積再進(jìn)行尺度縮放。

代碼

OpenCV中的 blur函數(shù)是進(jìn)行標(biāo)準(zhǔn)方框?yàn)V波: [cpp]?view plaincopy
  • void?cv::blur(?InputArray?src,?OutputArray?dst,??
  • ???????????Size?ksize,?Point?anchor,?int?borderType?)??
  • {??
  • ????boxFilter(?src,?dst,?-1,?ksize,?anchor,?true,?borderType?);??
  • }??
  • 而boxFilter函數(shù)源碼如下: [cpp]?view plaincopy
  • cv::Ptr<cv::FilterEngine>?cv::createBoxFilter(?int?srcType,?int?dstType,?Size?ksize,??
  • ????????????????????Point?anchor,?bool?normalize,?int?borderType?)??
  • {??
  • ????int?sdepth?=?CV_MAT_DEPTH(srcType);??
  • ????int?cn?=?CV_MAT_CN(srcType),?sumType?=?CV_64F;??
  • ????if(?sdepth?<=?CV_32S?&&?(!normalize?||??
  • ????????ksize.width*ksize.height?<=?(sdepth?==?CV_8U???(1<<23)?:??
  • ????????????sdepth?==?CV_16U???(1?<<?15)?:?(1?<<?16)))?)??
  • ????????sumType?=?CV_32S;??
  • ????sumType?=?CV_MAKETYPE(?sumType,?cn?);??
  • ??
  • ????Ptr<BaseRowFilter>?rowFilter?=?getRowSumFilter(srcType,?sumType,?ksize.width,?anchor.x?);??
  • ????Ptr<BaseColumnFilter>?columnFilter?=?getColumnSumFilter(sumType,??
  • ????????dstType,?ksize.height,?anchor.y,?normalize???1./(ksize.width*ksize.height)?:?1);??
  • ??
  • ????return?Ptr<FilterEngine>(new?FilterEngine(Ptr<BaseFilter>(0),?rowFilter,?columnFilter,??
  • ???????????srcType,?dstType,?sumType,?borderType?));??
  • }??
  • 這里 blur 和 boxFilter 的區(qū)別是,blur是標(biāo)準(zhǔn)化后的 boxFilter,即boxFilter的核函數(shù): 其中, [cpp]?view plaincopy
  • blur(?src,?dst,?Size(?1,?1?),?Point(-1,-1));??
  • blur(?src,?dst,?Size(?4,?4?),?Point(-1,-1));??
  • blur(?src,?dst,?Size(?8,?8?),?Point(-1,-1));??
  • blur(?src,?dst,?Size(?16,?16?),?Point(-1,-1));??
  • 實(shí)驗(yàn)結(jié)果

    下圖是對(duì)一幅圖像分別用1*1,4*4,8*8,16*16標(biāo)準(zhǔn)方框?yàn)V波后的圖像: ??????


    【高斯濾波】

    高斯濾波器是一類(lèi)根據(jù)高斯函數(shù)的形狀來(lái)選擇權(quán)值的線性平滑濾波器。它對(duì)去除服從正態(tài)分布的噪聲很有效。
    常用的零均值離散高斯濾波器函數(shù):

    2D圖像中表示為:

    代碼

    [cpp]?view plaincopy
  • /****************************************************************************************\?
  • ?????????????????????????????????????Gaussian?Blur?
  • \****************************************************************************************/??
  • ??
  • cv::Mat?cv::getGaussianKernel(?int?n,?double?sigma,?int?ktype?)??
  • {??
  • ????const?int?SMALL_GAUSSIAN_SIZE?=?7;??
  • ????static?const?float?small_gaussian_tab[][SMALL_GAUSSIAN_SIZE]?=??
  • ????{??
  • ????????{1.f},??
  • ????????{0.25f,?0.5f,?0.25f},??
  • ????????{0.0625f,?0.25f,?0.375f,?0.25f,?0.0625f},??
  • ????????{0.03125f,?0.109375f,?0.21875f,?0.28125f,?0.21875f,?0.109375f,?0.03125f}??
  • ????};??
  • ??
  • ????const?float*?fixed_kernel?=?n?%?2?==?1?&&?n?<=?SMALL_GAUSSIAN_SIZE?&&?sigma?<=?0????
  • ????????small_gaussian_tab[n>>1]?:?0;??
  • ??
  • ????CV_Assert(?ktype?==?CV_32F?||?ktype?==?CV_64F?);??
  • ????Mat?kernel(n,?1,?ktype);??
  • ????float*?cf?=?(float*)kernel.data;??
  • ????double*?cd?=?(double*)kernel.data;??
  • ??
  • ????double?sigmaX?=?sigma?>?0???sigma?:?((n-1)*0.5?-?1)*0.3?+?0.8;??
  • ????double?scale2X?=?-0.5/(sigmaX*sigmaX);??
  • ????double?sum?=?0;??
  • ??
  • ????int?i;??
  • ????for(?i?=?0;?i?<?n;?i++?)??
  • ????{??
  • ????????double?x?=?i?-?(n-1)*0.5;??
  • ????????double?t?=?fixed_kernel???(double)fixed_kernel[i]?:?std::exp(scale2X*x*x);??
  • ????????if(?ktype?==?CV_32F?)??
  • ????????{??
  • ????????????cf[i]?=?(float)t;??
  • ????????????sum?+=?cf[i];??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????cd[i]?=?t;??
  • ????????????sum?+=?cd[i];??
  • ????????}??
  • ????}??
  • ??
  • ????sum?=?1./sum;??
  • ????for(?i?=?0;?i?<?n;?i++?)??
  • ????{??
  • ????????if(?ktype?==?CV_32F?)??
  • ????????????cf[i]?=?(float)(cf[i]*sum);??
  • ????????else??
  • ????????????cd[i]?*=?sum;??
  • ????}??
  • ??
  • ????return?kernel;??
  • }??
  • ??
  • ??
  • cv::Ptr<cv::FilterEngine>?cv::createGaussianFilter(?int?type,?Size?ksize,??
  • ????????????????????????????????????????double?sigma1,?double?sigma2,??
  • ????????????????????????????????????????int?borderType?)??
  • {??
  • ????int?depth?=?CV_MAT_DEPTH(type);??
  • ????if(?sigma2?<=?0?)??
  • ????????sigma2?=?sigma1;??
  • ??
  • ????//?automatic?detection?of?kernel?size?from?sigma??
  • ????if(?ksize.width?<=?0?&&?sigma1?>?0?)??
  • ????????ksize.width?=?cvRound(sigma1*(depth?==?CV_8U???3?:?4)*2?+?1)|1;??
  • ????if(?ksize.height?<=?0?&&?sigma2?>?0?)??
  • ????????ksize.height?=?cvRound(sigma2*(depth?==?CV_8U???3?:?4)*2?+?1)|1;??
  • ??
  • ????CV_Assert(?ksize.width?>?0?&&?ksize.width?%?2?==?1?&&??
  • ????????ksize.height?>?0?&&?ksize.height?%?2?==?1?);??
  • ??
  • ????sigma1?=?std::max(?sigma1,?0.?);??
  • ????sigma2?=?std::max(?sigma2,?0.?);??
  • ??
  • ????Mat?kx?=?getGaussianKernel(?ksize.width,?sigma1,?std::max(depth,?CV_32F)?);??
  • ????Mat?ky;??
  • ????if(?ksize.height?==?ksize.width?&&?std::abs(sigma1?-?sigma2)?<?DBL_EPSILON?)??
  • ????????ky?=?kx;??
  • ????else??
  • ????????ky?=?getGaussianKernel(?ksize.height,?sigma2,?std::max(depth,?CV_32F)?);??
  • ??
  • ????return?createSeparableLinearFilter(?type,?type,?kx,?ky,?Point(-1,-1),?0,?borderType?);??
  • }??
  • ??
  • ??
  • void?cv::GaussianBlur(?InputArray?_src,?OutputArray?_dst,?Size?ksize,??
  • ???????????????????double?sigma1,?double?sigma2,??
  • ???????????????????int?borderType?)??
  • {??
  • ????Mat?src?=?_src.getMat();??
  • ????_dst.create(?src.size(),?src.type()?);??
  • ????Mat?dst?=?_dst.getMat();??
  • ??
  • ????if(?borderType?!=?BORDER_CONSTANT?)??
  • ????{??
  • ????????if(?src.rows?==?1?)??
  • ????????????ksize.height?=?1;??
  • ????????if(?src.cols?==?1?)??
  • ????????????ksize.width?=?1;??
  • ????}??
  • ??
  • ????if(?ksize.width?==?1?&&?ksize.height?==?1?)??
  • ????{??
  • ????????src.copyTo(dst);??
  • ????????return;??
  • ????}??
  • ??
  • #ifdef?HAVE_TEGRA_OPTIMIZATION??
  • ????if(sigma1?==?0?&&?sigma2?==?0?&&?tegra::gaussian(src,?dst,?ksize,?borderType))??
  • ????????return;??
  • #endif??
  • ??
  • ????Ptr<FilterEngine>?f?=?createGaussianFilter(?src.type(),?ksize,?sigma1,?sigma2,?borderType?);??
  • ????f->apply(?src,?dst?);??
  • }??

  • 實(shí)驗(yàn)結(jié)果

    下圖是對(duì)一幅圖像分別用1*1,3*3,5*5,9*9標(biāo)準(zhǔn)方框?yàn)V波后的圖像: ??????


    非線性濾波


    線性濾波易于構(gòu)造,且易于從頻率響應(yīng)的角度分析,但如果噪聲是散粒噪聲而非高斯噪聲時(shí)線性濾波不能去除噪聲。如圖像突然出現(xiàn)很大的值,線性濾波只是轉(zhuǎn)換為柔和但仍可見(jiàn)的散粒。這時(shí)需要非線性濾波。

    簡(jiǎn)單的非線性濾波有?中值濾波,?-截尾均值濾波定義域?yàn)V波?值域?yàn)V波?


    中值濾波選擇每個(gè)鄰域像素的中值輸出;?-截尾均值濾波是指去掉百分率為?的最小值和最大值;定義域?yàn)V波中沿著邊界的數(shù)字是像素的距離;值域就是去掉值域外的像素值。

    中值濾波代碼

    [cpp]?view plaincopy
  • medianBlur?(?src,?dst,?i?);??

  • 中值濾波實(shí)驗(yàn)

    下圖是對(duì)一幅圖像分別用3*3,5*5,7*7,9*9(這里必須是奇數(shù))標(biāo)準(zhǔn)方框?yàn)V波后的圖像:
    ??????


    【雙邊濾波】

    雙邊濾波的思想是抑制與中心像素值差別太大的像素,輸出像素值依賴(lài)于鄰域像素值的加權(quán)合:


    權(quán)重系數(shù) 取決于定義域核

    和依賴(lài)于數(shù)據(jù)的值域核
    的乘積。相乘后會(huì)產(chǎn)生依賴(lài)于數(shù)據(jù)的雙邊權(quán)重函數(shù):

    雙邊濾波源碼

    [cpp]?view plaincopy
  • /****************************************************************************************\?
  • ???????????????????????????????????Bilateral?Filtering?
  • \****************************************************************************************/??
  • ??
  • namespace?cv??
  • {??
  • ??
  • static?void??
  • bilateralFilter_8u(?const?Mat&?src,?Mat&?dst,?int?d,??
  • ????????????????????double?sigma_color,?double?sigma_space,??
  • ????????????????????int?borderType?)??
  • {??
  • ????int?cn?=?src.channels();??
  • ????int?i,?j,?k,?maxk,?radius;??
  • ????Size?size?=?src.size();??
  • ??
  • ????CV_Assert(?(src.type()?==?CV_8UC1?||?src.type()?==?CV_8UC3)?&&??
  • ????????src.type()?==?dst.type()?&&?src.size()?==?dst.size()?&&??
  • ????????src.data?!=?dst.data?);??
  • ??
  • ????if(?sigma_color?<=?0?)??
  • ????????sigma_color?=?1;??
  • ????if(?sigma_space?<=?0?)??
  • ????????sigma_space?=?1;??
  • ??
  • ????double?gauss_color_coeff?=?-0.5/(sigma_color*sigma_color);??
  • ????double?gauss_space_coeff?=?-0.5/(sigma_space*sigma_space);??
  • ??
  • ????if(?d?<=?0?)??
  • ????????radius?=?cvRound(sigma_space*1.5);??
  • ????else??
  • ????????radius?=?d/2;??
  • ????radius?=?MAX(radius,?1);??
  • ????d?=?radius*2?+?1;??
  • ??
  • ????Mat?temp;??
  • ????copyMakeBorder(?src,?temp,?radius,?radius,?radius,?radius,?borderType?);??
  • ??
  • ????vector<float>?_color_weight(cn*256);??
  • ????vector<float>?_space_weight(d*d);??
  • ????vector<int>?_space_ofs(d*d);??
  • ????float*?color_weight?=?&_color_weight[0];??
  • ????float*?space_weight?=?&_space_weight[0];??
  • ????int*?space_ofs?=?&_space_ofs[0];??
  • ??
  • ????//?initialize?color-related?bilateral?filter?coefficients??
  • ????for(?i?=?0;?i?<?256*cn;?i++?)??
  • ????????color_weight[i]?=?(float)std::exp(i*i*gauss_color_coeff);??
  • ??
  • ????//?initialize?space-related?bilateral?filter?coefficients??
  • ????for(?i?=?-radius,?maxk?=?0;?i?<=?radius;?i++?)??
  • ????????for(?j?=?-radius;?j?<=?radius;?j++?)??
  • ????????{??
  • ????????????double?r?=?std::sqrt((double)i*i?+?(double)j*j);??
  • ????????????if(?r?>?radius?)??
  • ????????????????continue;??
  • ????????????space_weight[maxk]?=?(float)std::exp(r*r*gauss_space_coeff);??
  • ????????????space_ofs[maxk++]?=?(int)(i*temp.step?+?j*cn);??
  • ????????}??
  • ??
  • ????for(?i?=?0;?i?<?size.height;?i++?)??
  • ????{??
  • ????????const?uchar*?sptr?=?temp.data?+?(i+radius)*temp.step?+?radius*cn;??
  • ????????uchar*?dptr?=?dst.data?+?i*dst.step;??
  • ??
  • ????????if(?cn?==?1?)??
  • ????????{??
  • ????????????for(?j?=?0;?j?<?size.width;?j++?)??
  • ????????????{??
  • ????????????????float?sum?=?0,?wsum?=?0;??
  • ????????????????int?val0?=?sptr[j];??
  • ????????????????for(?k?=?0;?k?<?maxk;?k++?)??
  • ????????????????{??
  • ????????????????????int?val?=?sptr[j?+?space_ofs[k]];??
  • ????????????????????float?w?=?space_weight[k]*color_weight[std::abs(val?-?val0)];??
  • ????????????????????sum?+=?val*w;??
  • ????????????????????wsum?+=?w;??
  • ????????????????}??
  • ????????????????//?overflow?is?not?possible?here?=>?there?is?no?need?to?use?CV_CAST_8U??
  • ????????????????dptr[j]?=?(uchar)cvRound(sum/wsum);??
  • ????????????}??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????assert(?cn?==?3?);??
  • ????????????for(?j?=?0;?j?<?size.width*3;?j?+=?3?)??
  • ????????????{??
  • ????????????????float?sum_b?=?0,?sum_g?=?0,?sum_r?=?0,?wsum?=?0;??
  • ????????????????int?b0?=?sptr[j],?g0?=?sptr[j+1],?r0?=?sptr[j+2];??
  • ????????????????for(?k?=?0;?k?<?maxk;?k++?)??
  • ????????????????{??
  • ????????????????????const?uchar*?sptr_k?=?sptr?+?j?+?space_ofs[k];??
  • ????????????????????int?b?=?sptr_k[0],?g?=?sptr_k[1],?r?=?sptr_k[2];??
  • ????????????????????float?w?=?space_weight[k]*color_weight[std::abs(b?-?b0)?+??
  • ????????????????????????std::abs(g?-?g0)?+?std::abs(r?-?r0)];??
  • ????????????????????sum_b?+=?b*w;?sum_g?+=?g*w;?sum_r?+=?r*w;??
  • ????????????????????wsum?+=?w;??
  • ????????????????}??
  • ????????????????wsum?=?1.f/wsum;??
  • ????????????????b0?=?cvRound(sum_b*wsum);??
  • ????????????????g0?=?cvRound(sum_g*wsum);??
  • ????????????????r0?=?cvRound(sum_r*wsum);??
  • ????????????????dptr[j]?=?(uchar)b0;?dptr[j+1]?=?(uchar)g0;?dptr[j+2]?=?(uchar)r0;??
  • ????????????}??
  • ????????}??
  • ????}??
  • }??
  • 雙邊濾波調(diào)用

    [cpp]?view plaincopy
  • bilateralFilter(InputArray?src,?OutputArray?dst,?int?d,?double?sigmaColor,?double?sigmaSpace,??
  • ??????????????????????int?borderType=BORDER_DEFAULT?);??
  • d 表示濾波時(shí)像素鄰域直徑,d為負(fù)時(shí)由 sigaColor計(jì)算得到;d>5時(shí)不能實(shí)時(shí)處理。 sigmaColor、sigmaSpace非別表示顏色空間和坐標(biāo)空間的濾波系數(shù)sigma。可以簡(jiǎn)單的賦值為相同的值。<10時(shí)幾乎沒(méi)有效果;>150時(shí)為油畫(huà)的效果。 borderType可以不指定。

    雙邊濾波實(shí)驗(yàn)

    用sigma為10,150,240,480時(shí)效果如下: ???????

    參考文獻(xiàn):

    Richard Szeliski 《Computer Vision: Algorithms and Applications》
    http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
    《The OpenCV Tutorials》 Release 2.4.2
    《The OpenCV Reference Manual 》 Release 2.4.2


    轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7785365

    總結(jié)

    以上是生活随笔為你收集整理的域滤波:方框、高斯、中值、双边滤波的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: av女优天堂在线观看 | 在线一区二区三区四区 | 日本 在线 | 草草屁屁影院 | 好看的中文字幕 | 夜av| 国产一区二区三区四区三区四 | 美女诱惑一区 | 在线观看成年人网站 | 精品久久无码中文字幕 | 国产91在线高潮白浆在线观看 | 国产精品久久久久久亚洲调教 | 国产成人无码av在线播放dvd | 成人午夜看片 | 茄子视频色 | 天天想夜夜操 | 国产一二三区免费视频 | 综合色久| 亚洲精品ww | 青青在线播放 | 男人懂得网站 | 久久大胆 | 超碰免费成人 | china国模大尺度pics | 免费久久视频 | 日韩日日日 | 色丁香av| 亚洲天堂一区二区在线 | 国产精品久久亚洲7777 | 亚洲免费观看 | 亚洲无吗视频 | 久久久久久久香蕉 | 中文字幕在线视频播放 | 精品国产无码一区二区 | 欧美全黄 | 欧美国产精品一区二区 | 国产乱淫av一区二区三区 | 亚洲影院中文字幕 | 久久露脸国语精品国产91 | 久久99精品国产.久久久久 | 国产精品久久久久久久久免费看 | 91精品毛片 | 黄色三级三级 | 日本免费一区二区三区视频 | 最新av免费观看 | 天天干天天插天天操 | 亚洲a中文字幕 | 尤物网站在线播放 | 国产无套粉嫩白浆内谢 | 久草视频在线免费 | 亚欧综合在线 | 性欧美长视频 | 中国a一片一级一片 | 成人免费av片 | 神马午夜dy888 | 日本视频色 | 草草视频在线观看 | 亚洲天堂黄 | 麻豆免费视频 | 伊人热久久| 毛片在线播放视频 | 日韩一区二区免费播放 | 牛牛在线免费视频 | 久久久久久久久久久网站 | 久久国产人妻一区二区免色戒电影 | 91av俱乐部 | 天天干天天操天天摸 | 好吊色网站 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 一级黄色片免费看 | 一道本在线观看视频 | 大象传媒成人在线观看 | 亚洲 小说区 图片区 | 免费荫蒂添的好舒服视频 | 四虎国产精品永久免费观看视频 | 亚洲天堂第一区 | 操比网站 | 亚洲熟女乱色综合亚洲小说 | 国产拍拍拍 | 国产精品8888 | 巨胸大乳www视频免费观看 | 欧美精品福利视频 | 中文字幕视频一区二区 | 美女考逼 | 亚洲天堂不卡 | a级片在线免费观看 | 亚洲免费激情视频 | 人妻va精品va欧美va | 亚洲四虎av | 免费视频福利 | 91黄色影视 | 日本va欧美va精品发布 | 日本视频中文字幕 | 久久亚洲欧洲 | 中文字幕一区二区三区四区 | 中文字幕亚洲一区二区三区五十路 | 乳罩脱了喂男人吃奶视频 | 亚洲自拍偷拍综合 | 992av|