日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 好色视频tv | aaaaaabbbbbb毛片 | 久久视频一区二区三区 | 日韩美女视频一区二区 | 亚洲午夜精品久久久久久浪潮 | 亚洲视频手机在线观看 | 小sao货水好多真紧h无码视频 | 日本成人在线播放 | www.色人阁| 久久影视av | 日本不卡123| 91欧美日韩 | 成人性生交大片免费看 | 国内国产精品天干天干 | 精品亚洲永久免费 | 午夜伦伦电影理论片费看 | 亚洲欧美另类激情 | 色婷婷av一区二区 | 91福利网站 | 短篇山村男同肉耽h | 国产成人综合亚洲 | 熟妇人妻一区二区三区四区 | 三级艳丽杨钰莹三级 | 小辣椒导航 | 91偷拍富婆spa盗摄在线 | 亚洲综合p| 四川丰满少妇被弄到高潮 | 亚洲三级成人 | 妺妺窝人体色www婷婷 | 国产中文一区二区三区 | 日本免费在线观看 | 亚洲黄色片网站 | japanese国产在线观看 | 一级黄色大片网站 | 超碰人人人人人人人 | 打屁股外国网站 | 成人在线免费看片 | 超碰男人| 日韩少妇一区二区 | 美女被啪啪 | 日韩视频一二三区 | 九九热8 | 天降女子在线 | 久久av无码精品人妻系列试探 | 国产av人人夜夜澡人人爽麻豆 | 色盈盈影院 | 怡红院国产| 欧美成人精品一区二区三区 | 欧美熟妇乱码在线一区 | 性av在线 | 亚洲人成网站999久久久综合 | 欧美精品网址 | 午夜高清福利 | 少妇看片 | 一本大道av伊人久久综合 | 粉嫩av一区二区三区 | 国产精品三级在线 | 男人的天堂毛片 | 国产精品11 | 黄色日批视频 | 超碰人人草 | 国内精品久久久久久久久久久 | 国产精品一级片在线观看 | 啪啪网页 | 在线观看麻豆 | 欧美一区二区三区激情 | 欧美色影院 | 美女网站免费黄 | av日韩中文字幕 | 亚洲日本一区二区 | 一个人免费在线观看视频 | 日韩av电影手机在线观看 | 国产一区一一区高清不卡 | 欧美 唯美 清纯 偷拍 | 法国空姐电影在线 | 国产精品污www一区二区三区 | 97人人干 | 正在播放超嫩在线播放 | 3d动漫精品h区xxxxx区 | h部分肌肉警猛淫文 | 亚洲视频99| 亚洲美女屁股眼交8 | 亚洲一区二区三区加勒比 | 91视频免费播放 | 和美女啪啪| 国产精品无码专区av在线播放 | 17c一起操| 国产拍拍拍 | 极品少妇在线观看 | 男人影院在线 | 人与禽性7777777 | 麻豆91av| 成人片在线播放 | 狠狠干天天射 | 封神榜二在线高清免费观看 | youjizzxxxxx| www一区二区三区 | 91视频专区 | 欧美黄色大片在线观看 |