OpenCV-Python系列六:圖像濾波

圖像濾波是一種十分常見的圖像處理手段蜘犁。通常扔字,你可以認為相鄰位置像素是緊密聯系的,它們共同來顯示對某個物體格嘁,圖像濾波則通過運算來排除圖像中和周圍相差大的像素笛求。當然,這并不是絕對的糕簿,有時候你為了評估圖像的質量探入,也會將這些“特立獨行”的像素作為選取的目標。無論你采用什么方法懂诗,記住你要的目標就行蜂嗽,有時候你的目標可能是別人的背景。
濾波常常會使得圖像變得模糊(非絕對)殃恒,那么植旧,為什么你需要將一幅清晰的圖像變得模糊呢?下面的例子應該可以解釋离唐。

1.無濾波模糊的邊緣特征(左上)病附,2.無濾波模糊的特征提取(右上)3.模糊化的邊緣特征(左下),4.模糊化邊緣后特征提取
區(qū)別在哪?放大圖像你就能發(fā)現問題了亥鬓,對近處的車道線提取的效果不太理想完沪,模糊處理后對車道線的提取效果較好,也存在環(huán)境干擾大的問題需要處理嵌戈,對于這些覆积,你可以通過設定直線特征閾值等操作來濾除听皿。這是由于在提取線特征時(霍夫變換),未經模糊化的邊緣鋸齒嚴重宽档,即便在鄰近區(qū)域擬合的直線也不同写穴,即便整體上它們落在一條直線上,累加器很難達到閾值雌贱。

相關博客:使用OpenCV進行實時車道檢測:http://www.reibang.com/p/c6b7a8a601f2

1.高斯濾波

高斯濾波采用滿足正態(tài)分布的核模板啊送,其參數的主要參數是標準差σ,代表核的離散程度欣孤,σ值越小馋没,模板中心系數與邊緣系數差越大,平滑的程度越小降传。
高斯濾波對圖像采集過程中由于不良照明/高溫引起的傳感器噪聲信號有較好的效果篷朵,消除了圖像中的高頻信號。

cv2,GaussianBlur(img, ksize, sigma_x, sigma_y,border_type)
只給定sigma_x時婆排,sigma_y會取相同的值声旺,如果兩個都是0,會依據核函數的大小計算段只。
cv2.getGaussianKernel(kszie, sigma, ktype)
ksize為核大小(奇數)腮猖,得到一個一維的垂向kernel

由于得到的是一維的Gaussian Kernel,你可以采用下面的方式轉為二維的

import cv2
import numpy as np

kernel_x = cv2.getGaussianKernel(5, 2, cv2.CV_32F)
kernel_y = cv2.getGaussianKernel(5, 2, cv2.CV_32F)
# 轉為2維的kernel
kernel_gaussian = np.multiply(kernel_x, np.transpose(kernel_y))

print(kernel_gaussian)

參考博客:二維高斯核函數https://blog.csdn.net/qq_16013649/article/details/78784791
對于kernel保留不同的小數位數對計算會產生一定的差距赞枕,請留意

灰度圖澈缺,灰度圖+Canny, 灰度圖+GaussianBlur+Canny

為了便于直觀感受高斯濾波的效果,使用Canny算子來提取輪廓對比炕婶,你可以試試在特征提取前加高斯濾波對比姐赡。

# 高斯濾波
import cv2
import numpy as np

img=cv2.imread('scraths.jpg')

gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 高斯平滑,為了消除圖像中的噪聲
gaussian_img = cv2.GaussianBlur(gray_img,(5, 5),0)
# Canny算子
gaussian_canny_edges_img = cv2.Canny(gaussian_img, 100, 200, 5)
canny_edges_img = cv2.Canny(gray_img, 100, 200, 5)



cv2.imshow('canny_img',canny_edges_img)
cv2.imshow('gaussian_canny_img',gaussian_canny_edges_img)
cv2.imshow('gray_img', gray_img)

cv2.waitKey(0)
cv2.destroyAllWindows()
2.均值濾波

均值濾波,中心點的像素為kernel區(qū)域像素的均值柠掂,使得像素間的差距變小项滑,達到平滑的效果,對脈沖型(椒鹽等)噪聲的效果不理想涯贞,不過在你需要提取輪廓特征時枪狂,讓圖像平滑些會更有利。
kernel為3和5的均值濾波效果
blur_img_3 = cv2.blur(gray_img, (3, 3))

cv2.blur(img, ksize, anchor, bordertype)
anchor通常取-1肩狂,將錨點(被平滑的點)設置為kernel的中心

補充說明:對于均值濾波摘完,你也可以使用cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])來實現,需要將normalize設置為True,當設置normalize為False時傻谁,實現的是將kernel內像素相加,官方文檔做出的描述為:

Unnormalized box filter is useful for computing various integral characteristics over each pixel neighborhood, such as covariance matrices of image derivatives (used in dense optical flow algorithms, and so on). If you need to compute pixel sums over variable-size windows.) 鏈接:https://docs.opencv.org/3.0-beta/modules/imgproc/doc/filtering.html?highlight=cv2.bilateralfilter#boxfilter
在后期的光流處理算法中可能會涉及到

3.中值濾波

中值濾波對圖像中的脈沖型(椒鹽等)噪聲信號處理效果好列粪,當你的應用場景存在這種顆粒感的噪聲信號時审磁,中值濾波會是一種很好的選擇谈飒。它,選取kernel區(qū)域內像素點集的中值最為錨點的像素值态蒂,對類似投票機制中的最高分(高灰階點)和最低分(過低灰階點)影響有很好的抑制作用杭措。

kernel size為5和9的中值濾波效果

cv2.medianBlur(img, ksize)
ksize須為奇數

4.雙邊濾波

如果你的應用涉及到圖像美化,雙邊濾波可以初步達到你的期望钾恢,關于雙邊濾波手素,這里不做展開,由你來探索瘩蚪,其函數參數信息如下泉懦。

cv2.bilateralFilter(img, d, sigma_color, sigma_space, bordertype)
d:表示在過濾過程中每個像素鄰域的直徑范圍。如果這個值是非正數疹瘦,則函數會從參數sigmaSpace計算該值崩哩。
sigmaColor: 顏色空間過濾器的sigma值,這個參數的值月大言沐,表明該像素鄰域內有月寬廣的顏色會被混合到一起邓嘹,產生較大的半相等顏色區(qū)域。
sigmaSpace: 坐標空間中濾波器的sigma值险胰,如果該值較大汹押,則意味著顏色相近的較遠的像素將相互影響,從而使更大的區(qū)域中足夠相似的顏色獲取相同的顏色起便。當d>0時鲸阻,d指定了鄰域大小且與sigmaSpace無關,否則d正比于sigmaSpace
參考博客:opencv學習(二十二)之雙邊濾波bilateralFilter:https://blog.csdn.net/keith_bb/java/article/details/54427779

5.filter2D自定義的kernel進行卷積

cv2.filter2D(src, ddepth, kernel[, anchor[, delta[, borderType]]])
ddepth:圖像的深度
kernel:自定義的核
anchor:錨點缨睡,默認(-1,-1)即核中心
delta:將像素存于dst之前會加上delta鸟悴,類似偏置
參考博客:Python-OpenCV中的filter2D()函數https://www.cnblogs.com/lfri/p/10599420.html
自定義kernel的方式如下:

# 根據自己kernel數據來選擇類型:https://www.runoob.com/numpy/numpy-dtype.html
kernel = np.array((
        [0.0625, 0.125, 0.0625],
        [0.125, 0.25, 0.125],
        [0.0625, 0.125, 0.0625]), dtype = np.float32)

對于opencv-python的圖像濾波部分有問題歡迎留言, Have Fun With OpenCV-Python, 下期見奖年。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末细诸,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子陋守,更是在濱河造成了極大的恐慌震贵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件水评,死亡現場離奇詭異猩系,居然都是意外死亡,警方通過查閱死者的電腦和手機中燥,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門寇甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事拿霉∫髦龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵绽淘,是天一觀的道長涵防。 經常有香客問我,道長沪铭,這世上最難降的妖魔是什么壮池? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮杀怠,結果婚禮上椰憋,老公的妹妹穿的比我還像新娘。我一直安慰自己驮肉,他們只是感情好熏矿,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著离钝,像睡著了一般票编。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卵渴,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天慧域,我揣著相機與錄音,去河邊找鬼浪读。 笑死昔榴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的碘橘。 我是一名探鬼主播互订,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痘拆!你這毒婦竟也來了仰禽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纺蛆,失蹤者是張志新(化名)和其女友劉穎吐葵,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體桥氏,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡温峭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了字支。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凤藏。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡奸忽,死狀恐怖,靈堂內的尸體忽然破棺而出清笨,到底是詐尸還是另有隱情月杉,我是刑警寧澤刃跛,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布抠艾,位于F島的核電站,受9級特大地震影響桨昙,放射性物質發(fā)生泄漏检号。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一蛙酪、第九天 我趴在偏房一處隱蔽的房頂上張望齐苛。 院中可真熱鬧,春花似錦桂塞、人聲如沸凹蜂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玛痊。三九已至,卻和暖如春狂打,著一層夾襖步出監(jiān)牢的瞬間擂煞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工趴乡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对省,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓晾捏,卻偏偏與公主長得像蒿涎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惦辛,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354