国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波

這篇具有很好參考價值的文章主要介紹了【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

??????歡迎來到本博客??????

?????? 本專欄主要結(jié)合OpenCV和C++來實現(xiàn)一些基本的圖像處理算法并詳細解釋各參數(shù)含義,適用于平時學習、工作快速查詢等,隨時更新。

?????? 具體食用方式:可以點擊本專欄【OpenCV快速查找(更新中)】–>搜索你要查詢的算子名稱或相關(guān)知識點,或者通過這篇博客??通俗易懂OpenCV(C++版)詳細教程——OpenCV函數(shù)快速查找(不斷更新中)]查閱你想知道的知識,即可食用。

??????支持:如果覺得博主的文章還不錯或者您用得到的話,可以悄悄關(guān)注一下博主哈,如果三連收藏支持就更好啦!這就是給予我最大的支持!??????


學習目標

  • 了解雙邊濾波含義及原理
  • C++實現(xiàn)雙邊濾波案例

??每一張圖像都可能包含某種程度的噪聲,噪聲可以理解為由一種或者多種原因造成的灰度值的隨機變化。
??在大多數(shù)情況下,通過平滑技術(shù)(也常稱為濾波技術(shù))進行抑制或者去除,其中具備保持邊緣(Edge Preserving)作用的平滑技術(shù)得到了更多的關(guān)注。
??常用的平滑處理算法包括基于二維離散卷積高斯平滑、均值平滑,基于統(tǒng)計學方法的中值平滑,具備保持邊緣作用的平滑算法的雙邊濾波、導向濾波等。

??下面幾節(jié)將詳細關(guān)于具備保持邊緣作用得相關(guān)方法,首先介紹雙邊濾波技術(shù)原理、常見應用及實現(xiàn)。


一、雙邊濾波原理

1.1 原理

??均值平滑和高斯平滑本質(zhì)上是計算每個位置的鄰域加權(quán)和作為該位置的輸出,只是這種運算可以用卷積實現(xiàn),加權(quán)系數(shù)模板是通過卷積核逆時針翻轉(zhuǎn)180°得到的。

??雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結(jié)合圖像的空間鄰近度和像素值相似度的一種折中濾波方法,根據(jù)每個位置的鄰域,對該位置構(gòu)建不同的權(quán)重模板,詳細過程如下:

??(1) 首先,構(gòu)建空間距離權(quán)重模板,與構(gòu)建高斯卷積核的過程類似。

【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波,# OpenCV(C++),圖像處理,opencv,c++,計算機視覺,人工智能

??其中wd表示鄰域內(nèi)某點q(k,l)與中心點p(i, j)的歐氏距離。σd為高斯函數(shù)的標準差。使用該公式生成的濾波器模板和高斯濾波器使用的模板是沒有區(qū)別的,每個位置的空間距離權(quán)重模板是相同的

??(2) 然后,構(gòu)建相似性權(quán)重模板,是通過(r,c)處的值與其鄰域值的差值的指數(shù)衡量的。

【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波,# OpenCV(C++),圖像處理,opencv,c++,計算機視覺,人工智能

??其中,f(i,j) 表示圖像在點(i,j)處的像素值;f(k,l) 為模板窗口中心坐標點的像素值。σr為高斯函數(shù)?標準差,顯然每個位置的相似性權(quán)重模板是不一樣的

??(3) 最后,將上述兩個模板相乘,然后進行歸一化,便可得到該位置的權(quán)重模板。

【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波,# OpenCV(C++),圖像處理,opencv,c++,計算機視覺,人工智能

??濾波后的圖像的像素值為:

【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波,# OpenCV(C++),圖像處理,opencv,c++,計算機視覺,人工智能

??將所得到的權(quán)重模板和該位置鄰域的對應位置相乘,然后求和就得到該位置的輸出值,和卷積運算的第二步操作類似

1.2 作用

??中值濾波、高斯濾波、維納濾波等濾波方法容易模糊圖片的邊緣細節(jié),對高頻細節(jié)的保護效果并不明顯。相較而言,雙邊濾波器可以很好的在降噪的同時保護邊緣。但是,雙邊濾波的卷積核是非線性的,因此計算復雜度高。


二、C++實現(xiàn)

2.1 原理實現(xiàn)

??首先,通過定義函數(shù)getClosenessWeight實現(xiàn)空間距離權(quán)重模板,代碼如下:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <cmath>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;

cv::Mat getClosenessWeight(double Sigma_g,Size size) {
	//獲取模板大小
	int H = size.height;
	int W = size.width;
	
	//獲取模板中心點
	int H_center = (H - 1) / 2;
	int W_center = (W - 1) / 2;

	//設(shè)置 空間距離權(quán)重模板
	Mat ClosenessWeight = Mat::zeros(size, CV_64FC1);
	for (int r = 0; r < H; r++){
		for (int c = 0; c <W; c++){
			double norm2 = pow(double(r- HH_center),2.0)+ pow(double(c - W_center), 2.0);
			double Sigma_g2 =2 * pow(Sigma_g, 2.0);
			
			//模板賦值
			ClosenessWeight.at<double>(r, c) = exp(-norm2 / Sigma_g2);
	}
		}
			return ClosenessWeight;
}

??通過定義函數(shù)bfltGray實現(xiàn)圖像的雙邊濾波:
????其中參數(shù)image代表圖像矩陣且灰度值,范圍是[0,1];
????參HW分別代表權(quán)重模板的高和寬且均為奇數(shù)
????sigma_g代表空間距離,權(quán)重模板的標準差;
????sigma_d代表相似性權(quán)重模板的標準差,1效果會比較好,返回值是浮點型矩陣。

??具體代碼如下:

Mat bfltGray(const Mat& image, Size winSize, float sigma_g, float sigma_d){
	int winH = winSize.height;
	int winW = winSize.width;

	//平滑窗口得高、寬為奇數(shù)
	CV_Assert(winH > 0 && winW > 0);
	CV_Assert(winH%2==1&& winW%2==1);

	if (winH==1 && winW==1){
		return image;
	}
	
	//中心點
	int half_winW = (winW - 1) / 2;
	int half_winH = (winH - 1) / 2;
	
	//空間距離得權(quán)重因子
	Mat closenessWeight = getClosenessWeight(sigma_g, winSize);
	
	//圖像得寬高
	int rows = image.rows;
	int cols = image.cols;

	//雙邊濾波后得輸出圖
	Mat blfImage =Mat::zeros(image.size(), CV_32FC1);
	
	//對每個像素得領(lǐng)域進行核卷積
	for (int r = 0; r < rows; r++){
		for (int c = 0; c < cols; c++){
			double pixel = image.at<double>(r, c);
			//判斷邊界
			int rTop= (r - half_winH) < 0 ? 0 : r - half_winH;
			int rBottom = (r + half_winH) > rows - 1 ? rows - 1 : r + half_winH;
			int cLeft = (c - half_winW) <0 ? 0 : c - half_winW;
			int cRight = (c + half_winW) > cols - 1 ? cols - 1 :  c + half_winW;
			
			//核作用區(qū)域
			Mat region = image(Rect(Point(cLeft, rTop),Point(cRight+1, rBottom+1))).clone();
			
			//相似性權(quán)重模板
			Mat similaritWeight;
			pow(region-pixel,2.0,similaritWeight);
			exp(-0.5 * similaritWeight / pow(sigma_d, 2), similaritWeight);
			similaritWeight /= pow(sigma_d, 2);

			//空間距離權(quán)重
			Rect regionRect = Rect(Point(cLeft - c + half_winW,rTop - r + half_winH),Point(cRight - c + half_winW,rBottom - r + half_winH + 1));

			Mat closenessWeightTemp = closenessWeight(regionRect).clone();

			//兩個權(quán)重模板點乘并歸一化
			Mat weightTemp =closenessWeightTemp.mul(similaritWeight);

			weightTemp = weightTemp /sum(weightTemp)[0];

			//權(quán)重模板與當前領(lǐng)域?qū)恢孟喑耍蠛?/span>
			Mat result = weightTemp.mul(region);
			blfImage.at<double>(r, c)= sum(result)[0];
	}
		}
	return blfImage;
}

??使用bfltGray實現(xiàn)圖像的雙濾濾波,需要注意bfltGray返回的是灰度值在范圍[0,1]之間的浮點型圖像矩陣,如果使用函數(shù)imwrite直接保存的話,則顯示為一張黑色的圖片,所以要先乘以255并轉(zhuǎn)換為8位圖進行保存。主函數(shù)如下:

int main() {
	//輸入圖像
	Mat I = imread("D:/VSCodeFile/OpenCV_CSDN/image/logo_gray.jpeg");

	if (!I.data)
	{
		return -1;
	}

	//灰度值歸一化
	Mat FI;
	I.convertTo(FI, CV_64FC1, 1.0 / 255, 0);

	//雙邊濾波
	Mat blfI = bflfGray(FI,Size(7,7),19,0.5);

	//顯示原圖與結(jié)果圖
	imshow("原圖",I);
	imshow("雙邊濾波", blfI);

	//若保存為8位圖,則需要乘255,并轉(zhuǎn)換為CV_8U
	blfI.convertTo(blfI, CV_8U,  255, 0);
	imshow("blf", blfI);
	waitKey(0);
	return 0;
}

2.2 OpenCV函數(shù)

??在OpenCV中通過定義函數(shù)bilateralFilter實現(xiàn)了雙邊濾波的功能。

cv::bilateralFilter(InputArray src,
					OutputArray dst,
					int d,
					double sigmaColor,
					double sigmaSpace,
					int borderType = BORDER_DEFAULT 
)
參數(shù) 解釋
src 輸入矩陣,Mat類型,8位或者浮點型單通道、三通道的圖像
dst 輸出矩陣,其大小與數(shù)據(jù)類型和src一致
d 表示在過濾過程中每個像素鄰域的直徑。如果這個值設(shè)其為非正數(shù),那么會從第五個參數(shù)sigmaSpace來計算出它來,在使用過程中類似于模糊力度。
sigmaColor 顏色空間濾波器的sigma值。這個參數(shù)的值越大,就表明該像素鄰域內(nèi)有更寬廣的顏色會被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。類似模糊范圍的意思,范圍越大看著越模糊
sigmaSpace 坐標空間中濾波器的sigma值,坐標空間的標注方差。數(shù)值越大,意味著越遠的像素會相互影響,從而使更大的區(qū)域足夠相似的顏色獲取相同的顏色。當d>0,d指定了鄰域大小且與sigmaSpace無關(guān)。否則,d正比于sigmaSpace。值越大,圖像的過渡效果越好。
borderType 推斷圖像邊緣像素的邊界模式,默認

三、 總結(jié)

??最后,長話短說,大家看完就好好動手實踐一下,切記不能三分鐘熱度、三天打魚,兩天曬網(wǎng)。OpenCV是學習圖像處理理論知識比較好的一個途徑,大家也可以自己嘗試寫寫博客,來記錄大家平時學習的進度,可以和網(wǎng)上眾多學者一起交流、探討,有什么問題希望大家可以積極評論交流,我也會及時更新,來督促自己學習進度。希望大家覺得不錯的可以點贊、關(guān)注、收藏。文章來源地址http://www.zghlxwxcb.cn/news/detail-543906.html


?????? 今天的文章就到這里啦~
喜歡的話,點贊??、收藏??、關(guān)注??哦 ~
【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波,# OpenCV(C++),圖像處理,opencv,c++,計算機視覺,人工智能

到了這里,關(guān)于【圖像處理OpenCV(C++版)】——5.5 圖像平滑之雙邊濾波的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Opencv-C++筆記 (13) : opencv-圖像卷積一(均值、中值、高斯、雙邊濾波)與 邊緣處理

    Opencv-C++筆記 (13) : opencv-圖像卷積一(均值、中值、高斯、雙邊濾波)與 邊緣處理

    頭文件 quick_opencv.h:聲明類與公共函數(shù) 主函數(shù)調(diào)用 src:輸入圖像 。 dst:輸出圖像 。 ksize:內(nèi)核大小 ,一般用 Size(w,h),w 為寬度,h 為深度。 anchor:被平滑的點,表示取 內(nèi)核中心 ,默認值 Point(-1,-1)。 boderType:推斷圖像外部像素的某種邊界模式。默認值 BORDER_DEFAULT 目的:

    2024年02月16日
    瀏覽(920)
  • 【OpenCV ? c++】圖像平滑處理(1) —— 線性濾波

    【OpenCV ? c++】圖像平滑處理(1) —— 線性濾波

    ??平滑處理也稱為模糊處理,是一種簡單且使用頻率很高的圖像處理方法,平滑處理的用途有很多,最常見的是用來減少圖像上的噪點或者失真。在涉及到降低圖像分辨率時,平滑處理是非常好用的方法。 ??圖像濾波指的是在盡量保留圖像細節(jié)特征的條件下對圖像的噪音

    2024年03月20日
    瀏覽(25)
  • opencv 31-圖像平滑處理-方框濾波cv2.boxFilter()

    opencv 31-圖像平滑處理-方框濾波cv2.boxFilter()

    方框濾波(Box Filtering)是一種簡單的圖像平滑處理方法,它主要用于去除圖像中的噪聲和減少細節(jié),同時保持圖像的整體亮度分布。 方框濾波的原理很簡單:對于圖像中的每個像素,將其周圍的一個固定大小的鄰域內(nèi)的像素值取平均,然后將這個平均值賦值給當前像素。這

    2024年02月14日
    瀏覽(19)
  • opencv 30 -圖像平滑處理01-均值濾波 cv2.blur()

    opencv 30 -圖像平滑處理01-均值濾波 cv2.blur()

    圖像平滑處理(Image Smoothing)是一種圖像處理技術(shù),旨在減少圖像中的噪聲、去除細節(jié)并平滑圖像的過渡部分。這種處理常用于預處理圖像,以便在后續(xù)圖像處理任務中獲得更好的結(jié)果。 常用的圖像平滑處理方法包括: 均值濾波(Mean Filtering) :用圖像中像素周圍區(qū)域的平

    2024年02月01日
    瀏覽(88)
  • opencv(15) 圖像平滑處理之二:cv2.GaussianBlur()高斯濾波

    opencv(15) 圖像平滑處理之二:cv2.GaussianBlur()高斯濾波

    高斯濾波是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應用于圖像處理的減噪過程。 高斯模板是通過對二維高斯函數(shù)進行采樣(高斯模糊的卷積核里的數(shù)值滿足高斯分布)、量化并歸一化得到的,它考慮了鄰域像素位置的影響,距離當前被平滑像素越近的點,加權(quán)系數(shù)越大

    2024年02月10日
    瀏覽(97)
  • 【OpenCV實現(xiàn)平滑圖像處理】

    【OpenCV實現(xiàn)平滑圖像處理】

    在圖像處理中,低通濾波器是一種常用的技術(shù),用于平滑、模糊或降低圖像的噪音。這種濾波器通過去除圖像中高頻部分(即變化較快的部分)來實現(xiàn)這些效果。通過應用2D卷積操作,低通濾波器將每個像素的值與其周圍像素的值進行加權(quán)平均,從而實現(xiàn)圖像的平滑處理。 在

    2024年02月08日
    瀏覽(26)
  • 【圖像處理OpenCV(C++版)】——5.2 圖像平滑之高斯平滑

    【圖像處理OpenCV(C++版)】——5.2 圖像平滑之高斯平滑

    前言 : ?????? 歡迎來到本博客 ?????? ?????? 本專欄主要結(jié)合OpenCV和C++來實現(xiàn)一些基本的圖像處理算法并詳細解釋各參數(shù)含義,適用于平時學習、工作快速查詢等,隨時更新。 ?????? 具體食用方式:可以點擊本專欄【OpenCV快速查找(更新中)】–搜索你要查詢的算子

    2024年02月15日
    瀏覽(15)
  • 【OpenCV】第七章: 圖像平滑處理

    【OpenCV】第七章: 圖像平滑處理

    第七章: 圖像平滑處理 1、什么是圖像平滑處理 圖像平滑處理就是,將圖像中與 周圍像素點的像素值差異較大的像素點 調(diào)整成 和周圍像素點像素值 相近的值。 例如: 2、為什么要進行平滑處理? 因為圖像在采集(生成)、傳輸、處理的過程中常常會存在一定的噪聲干擾,比如

    2024年02月03日
    瀏覽(23)
  • Python-OpenCV中的圖像處理-圖像平滑

    Python-OpenCV中的圖像處理-圖像平滑

    使用低通濾波器可以達到圖像模糊的目的。這對與去除噪音很有幫助。其實就是去除圖像中的高頻成分(比如:噪音,邊界)。所以邊界也會被模糊一點。(當然,也有一些模糊技術(shù)不會模糊掉邊界)。 這是由一個歸一化卷積框完成的。他只是用卷積框覆蓋區(qū)域所有像素的平

    2024年02月13日
    瀏覽(23)
  • 第五章 Opencv圖像處理框架實戰(zhàn) 5-3 圖像閾值與平滑處理

    第五章 Opencv圖像處理框架實戰(zhàn) 5-3 圖像閾值與平滑處理

    ret, dst = cv2.threshold(src, thresh, maxval, type) src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖 dst: 輸出圖 thresh: 閾值 maxval: 當像素值超過了閾值(或者小于閾值,根據(jù)type來決定),所賦予的值 type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY

    2024年02月14日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包