【轉(zhuǎn)載】opencv 頻域高通、低通濾波演示

https://www.oschina.net/code/snippet_1170370_32834


opencv?理想濾波凿叠、巴特沃茲濾波和高斯濾波的高通涩笤、低通濾波演示

????Filter?Parameters?窗口:?濾波器參數(shù)窗口

????????-?d0:?濾波器大小?D0

????????-?flag:?濾波器類型

?????????????0?-?理想濾波

?????????????1?-?巴特沃茲濾波

?????????????2?-?高斯濾波

????????-?n:?巴特沃茲濾波的階數(shù)

????????-?lh:?低通濾波?or?高通濾波

????Filtered?Image?窗口:?過濾后的圖像和過濾器圖像

#! /usr/bin/env python

#coding=utf-8


importcv2

importnumpy as np


'''

opencv 理想濾波、巴特沃茲濾波和高斯濾波的高通幔嫂、低通濾波演示


????Filter Parameters 窗口: 濾波器參數(shù)窗口

????????- d0: 濾波器大小 D0

????????- flag: 濾波器類型

?????????????0 - 理想濾波

?????????????1 - 巴特沃茲濾波

?????????????2 - 高斯濾波

????????- n: 巴特沃茲濾波的階數(shù)

????????- lh: 低通濾波 or 高通濾波


????Filtered Image 窗口: 過濾后的圖像和過濾器圖像

'''


defcombine_images(images, axis=1):

????'''

????合并圖像辆它。


????@param images: 圖像列表(圖像成員的維數(shù)必須相同)

????@param axis: 合并方向誊薄。

????????axis=0時(shí)履恩,圖像垂直合并;

????????axis = 1 時(shí), 圖像水平合并呢蔫。

????@return 合并后的圖像

????'''

????ndim =images[0].ndim


????shapes =np.array([mat.shape format inimages])


????assertnp.all(map(lambdae: len(e)==ndim, shapes)), 'all images should be same ndim.'


????ifaxis ==0:# 垂直方向合并圖像

????????# 合并圖像的 cols

????????cols =np.max(shapes[:, 1])

????????# 擴(kuò)展各圖像 cols大小切心,使得 cols一致

????????copy_imgs =[cv2.copyMakeBorder(img, 0, 0, 0, cols-img.shape[1],

????????????cv2.BORDER_CONSTANT, (0,0,0))? forimg inimages]

????????# 垂直方向合并

????????returnnp.vstack(copy_imgs)

????else:# 水平方向合并圖像

????????# 合并圖像的 rows

????????rows =np.max(shapes[:, 0])

????????# 擴(kuò)展各圖像rows大小片吊,使得 rows一致

????????copy_imgs =[cv2.copyMakeBorder(img, 0, rows-img.shape[0], 0, 0,

????????????cv2.BORDER_CONSTANT, (0,0,0))? forimg inimages]

????????# 水平方向合并

????????returnnp.hstack(copy_imgs)



deffft(img):

????'''對(duì)圖像進(jìn)行傅立葉變換,并返回?fù)Q位后的頻率矩陣'''

????assertimg.ndim==2, 'img should be gray.'


????rows, cols =img.shape[:2]


????# 計(jì)算最優(yōu)尺寸

????nrows =cv2.getOptimalDFTSize(rows)

????ncols =cv2.getOptimalDFTSize(cols)


????# 根據(jù)新尺寸俏脊,建立新變換圖像

????nimg =np.zeros((nrows, ncols))

????nimg[:rows,:cols] =img


????# 傅立葉變換

????fft_mat =cv2.dft(np.float32(nimg), flags=cv2.DFT_COMPLEX_OUTPUT)


????# 換位爷贫,低頻部分移到中間认然,高頻部分移到四周

????returnnp.fft.fftshift(fft_mat)



deffft_image(fft_mat):

????'''將頻率矩陣轉(zhuǎn)換為可視圖像'''

????# log函數(shù)中加1卷员,避免log(0)出現(xiàn).

????log_mat=cv2.log(1+cv2.magnitude(fft_mat[:,:,0], fft_mat[:,:,1]))


????# 標(biāo)準(zhǔn)化到0~255之間

????cv2.normalize(log_mat, log_mat, 0, 255, cv2.NORM_MINMAX)

????returnnp.uint8(np.around(log_mat))



defifft(fft_mat):

????'''傅立葉反變換腾务,返回反變換圖像'''

????# 反換位,低頻部分移到四周,高頻部分移到中間

????f_ishift_mat =np.fft.ifftshift(fft_mat)


????# 傅立葉反變換

????img_back =cv2.idft(f_ishift_mat)


????# 將復(fù)數(shù)轉(zhuǎn)換為幅度, sqrt(re^2 + im^2)

????img_back =cv2.magnitude(*cv2.split(img_back))


????# 標(biāo)準(zhǔn)化到0~255之間

????cv2.normalize(img_back, img_back, 0, 255, cv2.NORM_MINMAX)

????returnnp.uint8(np.around(img_back))



deffft_distances(m, n):

????'''

????計(jì)算m,n矩陣每一點(diǎn)距離中心的距離

????見《數(shù)字圖像處理MATLAB版.岡薩雷斯》93頁

????'''

????u =np.array([i ifi<=m/2elsem-i fori inrange(m)], dtype=np.float32)

????v =np.array([i ifi<=m/2elsem-i fori inrange(m)], dtype=np.float32)

????v.shape =n, 1


????# 每點(diǎn)距離矩陣左上角的距離

????ret =np.sqrt(u*u +v*v)


????# 每點(diǎn)距離矩陣中心的距離

????returnnp.fft.fftshift(ret)



deflpfilter(flag, rows, cols, d0, n):

????'''低通濾波器

????@param flag: 濾波器類型

????????0 - 理想低通濾波

????????1 - 巴特沃茲低通濾波

????????2 - 高斯低通濾波

????@param rows: 被濾波的矩陣高度

????@param cols: 被濾波的矩陣寬度

????@param d0: 濾波器大小 D0

????@param n: 巴特沃茲低通濾波的階數(shù)?

????@return 濾波器矩陣

????'''

????assertd0 > 0, 'd0 should be more than 0.'


????filter_mat =None


????#理想低通濾波

????ifflag ==0:

????????filter_mat =np.zeros((rows, cols ,2), np.float32)

????????cv2.circle(filter_mat, (rows/2, cols/2) , d0, (1,1,1), thickness=-1)?


????# 巴特沃茲低通濾波

????elifflag ==1:

????????duv =fft_distances(*fft_mat.shape[:2])

????????filter_mat =1/(1+np.power(duv/d0, 2*n))

????????# fft_mat有2個(gè)通道,實(shí)部和虛部

????????# fliter_mat 也需要2個(gè)通道

????????filter_mat =cv2.merge((filter_mat, filter_mat))


????#高斯低通濾波

????else:

????????duv =fft_distances(*fft_mat.shape[:2])

????????filter_mat =np.exp(-(duv*duv) /(2*d0*d0))

????????# fft_mat有2個(gè)通道叙凡,實(shí)部和虛部

????????# fliter_mat 也需要2個(gè)通道

????????filter_mat =cv2.merge((filter_mat, filter_mat))?????????????????


????returnfilter_mat



defhpfilter(flag, rows, cols, d0, n):

????'''高通濾波器

????@param flag: 濾波器類型

????????0 - 理想高通濾波

????????1 - 巴特沃茲高通濾波

????????2 - 高斯高通濾波

????@param rows: 被濾波的矩陣高度

????@param cols: 被濾波的矩陣寬度

????@param d0: 濾波器大小 D0

????@param n: 巴特沃茲高通濾波的階數(shù)?

????@return 濾波器矩陣

????'''

????assertd0 > 0, 'd0 should be more than 0.'


????filter_mat =None


????#理想高通濾波

????ifflag ==0:

????????filter_mat =np.ones((rows, cols ,2), np.float32)

????????cv2.circle(filter_mat, (rows/2, cols/2) , d0, (0,0,0), thickness=-1)?


????# 巴特沃茲高通濾波

????elifflag ==1:

????????duv =fft_distances(rows, cols)


????????# duv有 0 值(中心距離中心為0)狭姨, 為避免除以0,設(shè)中心為 0.000001

????????duv[rows/2, cols/2] =0.000001


????????filter_mat =1/(1+np.power(d0/duv, 2*n))

????????# fft_mat有2個(gè)通道饼拍,實(shí)部和虛部

????????# fliter_mat 也需要2個(gè)通道

????????filter_mat =cv2.merge((filter_mat, filter_mat))


????#高斯高通濾波

????else:

????????duv =fft_distances(*fft_mat.shape[:2])

????????filter_mat =1-np.exp(-(duv*duv) /(2*d0*d0))

????????# fft_mat有2個(gè)通道,實(shí)部和虛部

????????# fliter_mat 也需要2個(gè)通道

????????filter_mat =cv2.merge((filter_mat, filter_mat))?????????????????


????returnfilter_mat



defdo_filter(_=None):

????'''濾波漓柑,并顯示'''

????d0 =cv2.getTrackbarPos('d0', filter_win)

????flag =cv2.getTrackbarPos('flag', filter_win)

????n =cv2.getTrackbarPos('n', filter_win)

????lh =cv2.getTrackbarPos('lh', filter_win)


????# 濾波器

????filter_mat =None

????iflh ==0:

????????filter_mat =lpfilter(flag, fft_mat.shape[0], fft_mat.shape[1], d0, n)

????else:

????????filter_mat =hpfilter(flag, fft_mat.shape[0], fft_mat.shape[1], d0, n)


????# 進(jìn)行濾波

????filtered_mat =filter_mat *fft_mat


????# 反變換

????img_back =ifft(filtered_mat)


????# 顯示濾波后的圖像和濾波器圖像

????cv2.imshow(image_win, combine_images([img_back, fft_image(filter_mat)]))



if__name__ =='__main__':

????img =cv2.imread('images/Fig0515.jpg',0)

????rows, cols =img.shape[:2]


????# 濾波器窗口名稱

????filter_win ='Filter Parameters'

????# 圖像窗口名稱

????image_win ='Filtered Image'


????cv2.namedWindow(filter_win)

????cv2.namedWindow(image_win)


????# 創(chuàng)建d0 tracker, d0為過濾器大小

????cv2.createTrackbar('d0', filter_win, 20, min(rows, cols)/4, do_filter)


????# 創(chuàng)建flag tracker,

????# flag=0時(shí)辆布,為理想濾波

????# flag=1時(shí)茶鉴,為巴特沃茲濾波

????# flag=2時(shí),為高斯濾波

????cv2.createTrackbar('flag', filter_win, 0, 2, do_filter)


????# 創(chuàng)建n tracker

????# n 為巴特沃茲濾波的階數(shù)

????cv2.createTrackbar('n', filter_win, 1, 5, do_filter)


????# 創(chuàng)建lh tracker

????# lh: 濾波器是低通還是高通涵叮, 0 為低通, 1為高通

????cv2.createTrackbar('lh', filter_win, 0, 1, do_filter)


????fft_mat =fft(img)


????do_filter()


????cv2.resizeWindow(filter_win, 512, 20)

????cv2.waitKey(0)

????cv2.destroyAllWindows()

2.?[圖片]?低通圖像和濾波器.jpg

3.?[圖片]?濾波器參數(shù).jpg

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舀瓢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航缀,老刑警劉巖朵锣,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诚些,居然都是意外死亡皇型,警方通過查閱死者的電腦和手機(jī)砸烦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門幢痘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颜说,你說我怎么就攤上這事∶欧啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵乾吻,是天一觀的道長(zhǎng)拟蜻。 經(jīng)常有香客問我,道長(zhǎng)酝锅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任擒权,我火速辦了婚禮阁谆,結(jié)果婚禮上愉老,老公的妹妹穿的比我還像新娘。我一直安慰自己嫉入,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谓晌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪护侮。 梳的紋絲不亂的頭發(fā)上挂捻,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音啸盏,去河邊找鬼。 笑死回懦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的健民。 我是一名探鬼主播贫贝,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼稚晚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸳劳,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤也搓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后傍妒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡既忆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嗦玖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苛吱。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡器瘪,死狀恐怖绘雁,靈堂內(nèi)的尸體忽然破棺而出彰亥,到底是詐尸還是另有隱情,我是刑警寧澤任斋,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布废酷,位于F島的核電站瘟檩,受9級(jí)特大地震影響澈蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趴俘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望太惠。 院中可真熱鬧疲憋,春花似錦、人聲如沸缚柳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翰绊。三九已至佩谷,卻和暖如春监嗜,著一層夾襖步出監(jiān)牢的瞬間抡谐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工刽肠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音五。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像厨钻,于是被迫代替她去往敵國和親坚嗜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容