python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波
寫在前面
HIT大三上學(xué)期視聽覺信號處理課程中視覺部分的實(shí)驗(yàn)二,經(jīng)過和學(xué)長們實(shí)驗(yàn)的對比發(fā)現(xiàn)每一級實(shí)驗(yàn)要求都不一樣,因此這里標(biāo)明了是2019年秋季學(xué)期的視覺實(shí)驗(yàn)二。
由于時(shí)間緊張,代碼沒有進(jìn)行任何優(yōu)化,實(shí)驗(yàn)算法僅供參考。
實(shí)驗(yàn)要求
實(shí)現(xiàn)圖像直方圖均衡化,要求顯示均衡化前、后直方圖以及均衡化后圖像。
對單通道圖像進(jìn)行DFT變換,要求顯示幅度圖和相位圖,并設(shè)計(jì)理想高通濾波器和高斯低通濾波器對圖像進(jìn)行頻域?yàn)V波,并顯示濾波之后的圖像。 注:除DFT和IDFT外,不允許調(diào)庫
實(shí)驗(yàn)代碼
代碼首先貼在這里,僅供參考
首先是實(shí)現(xiàn)圖像直方圖均衡化的代碼
from ReadBmp import ReadBmp
import matplotlib.pyplot as plt
import numpy as np
filename1 = "1.bmp"
bmp = ReadBmp(filename1)
bmp.gray()
# 統(tǒng)計(jì)各像素點(diǎn)數(shù)
h = np.array([0 for i in range(256)])
h1 = []
for pixel in bmp.data:
h[pixel[0]] = h[pixel[0]] + 1
h1.append(pixel[0])
# 畫出原先的直方圖
plt.subplot(1,2,1)
plt.hist(h1, bins = 256)
# 歸一化
hs = h / len(bmp.data)
# 計(jì)算累計(jì)分布
hp = np.array([0.0 for i in range(256)])
for i in range(256):
hp[i] = np.round(np.sum(hs[0:i+1]) * 255)
T = hp.astype('uint8')
# 創(chuàng)建新圖像,并統(tǒng)計(jì)新圖像的各個(gè)像素點(diǎn)的個(gè)數(shù)
hn = np.array([0 for i in range(256)])
h2 = []
for pixel in bmp.data:
s = T[pixel[0]]
pixel[0] = s
pixel[1] = s
pixel[2] = s
hn[pixel[0]] = hn[pixel[0]] + 1
h2.append(s)
bmp.creataBmp("2.bmp")
# 畫出新圖像的直方圖
plt.subplot(1,2,2)
plt.hist(h2, bins = 256)
plt.show()
其中讀取bmp圖像的程序是我自己寫的,這里不再贅述(直接調(diào)用了實(shí)驗(yàn)一寫好的bmp文件讀取程序,具體代碼見github)
然后是理想高通濾波和高斯低通濾波的程序
import numpy as np
import cv2
import matplotlib.pyplot as plt
def IdealHighPassFiltering(f_shift):
# 設(shè)置濾波半徑
D0 = 8
# 初始化
m = f_shift.shape[0]
n = f_shift.shape[1]
h1 = np.zeros((m, n))
x0 = np.floor(m/2)
y0 = np.floor(n/2)
for i in range(m):
for j in range(n):
D = np.sqrt((i - x0)**2 + (j - y0)**2)
if D >= D0:
h1[i][j] = 1
result = np.multiply(f_shift, h1)
return result
def GaussLowPassFiltering(f_shift):
# 設(shè)置濾波半徑
D0 = 8
# 初始化
m = f_shift.shape[0]
n = f_shift.shape[1]
h1 = np.zeros((m, n))
x0 = np.floor(m/2)
y0 = np.floor(n/2)
for i in range(m):
for j in range(n):
D = np.sqrt((i - x0)**2 + (j - y0)**2)
h1[i][j] = np.exp((-1)*D**2/2/(D0**2))
result = np.multiply(f_shift, h1)
return result
img =cv2.imread('1.bmp',0)
f=np.fft.fft2(img)
f_shift=np.fft.fftshift(f)
# 幅度圖
s= np.log(abs(f_shift))
# 相位圖
p= abs(np.angle(f_shift))
plt.subplot(2,2,1)
plt.imshow(s, 'gray')
plt.subplot(2,2,2)
plt.imshow(p, 'gray')
# 理想高通濾波
IHPF = IdealHighPassFiltering(f_shift)
new_f1 = np.fft.ifftshift(IHPF)
new_image1 = np.uint8(np.abs(np.fft.ifft2(new_f1)))
plt.subplot(2,2,3)
plt.imshow(new_image1, 'gray')
# 高斯低通濾波
GLPF = GaussLowPassFiltering(f_shift)
new_f2 = np.fft.ifftshift(GLPF)
new_image2 = np.uint8(np.abs(np.fft.ifft2(new_f2)))
plt.subplot(2,2,4)
plt.imshow(new_image2, 'gray')
plt.show()
實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)結(jié)果的圖像如下圖所示
這是直方圖均衡化的運(yùn)行結(jié)果,其中左圖是做直方圖均衡化前對像素統(tǒng)計(jì)的直方圖,右圖是做直方圖均衡化后對像素統(tǒng)計(jì)的直方圖
這是畫出圖像的幅度圖和相位圖,對圖像做理想高通濾波和高斯低通濾波的結(jié)果,其中1是幅度圖,2是相位圖,3是理想高通濾波的結(jié)果,4是高斯低通濾波的結(jié)果
要點(diǎn)講解
關(guān)于實(shí)驗(yàn)算法的大致流程,已在程序中用注釋標(biāo)明,這里只記錄需要注意的地方
在直方圖均衡化中,要注意直方圖函數(shù)的用法,該函數(shù)可以對輸入的矩陣中的數(shù)值進(jìn)行自動(dòng)的分類,而不用手動(dòng)分好之后再用直方圖函數(shù)去畫,之前沒有仔細(xì)看該函數(shù)的用法,導(dǎo)致找了好長時(shí)間沒找到問題。
關(guān)于直方圖均衡化的原理,需要一定的數(shù)學(xué)公式的推導(dǎo),然而其結(jié)論十分簡單,只有一個(gè)公式,對理解公式推導(dǎo)無需求的直接拿公式來用就可以了。(即程序中的歸一化加計(jì)算累積分布部分)
關(guān)于理想高通濾波和高斯低通濾波,可以看到其代碼大體框架是一致的,只有中間if語句中的判斷條件不一樣,理解原理之后直接替換if語句即可。
最終畫出理想高通濾波的圖像時(shí),網(wǎng)上給出的一些運(yùn)行結(jié)果可能和我們運(yùn)行的不一致,類似于下圖中圖一的圖像,原因在于這一句話中:new_image1 = np.uint8(np.abs(np.fft.ifft2(new_f1))),注意到中間調(diào)用了np.abs()函數(shù),由于經(jīng)過DFT變換之后所得的數(shù)值是復(fù)數(shù),而不是實(shí)數(shù),若將np.abs()替換為np.real(),即只取其實(shí)部,則得到的是圖一,而使用np.abs(),得到的則是圖二。個(gè)人感覺圖二才是相對正確一些的結(jié)果,圖一相當(dāng)于將虛部舍棄掉了,這是不太好的。
以下是圖一
以下是圖二
知識總結(jié)
關(guān)于直方圖均衡化的數(shù)學(xué)原理,我參考的是這篇博客。直方圖均衡化的公式推導(dǎo)較為復(fù)雜,然而其結(jié)果卻十分簡單,因此在python中一個(gè)循環(huán)就實(shí)現(xiàn)了。
直方圖均衡化的數(shù)學(xué)原理
其中在理想高通和高斯低通濾波器中,需要用到矩陣乘法,關(guān)于幾種不同的矩陣乘法參考的是這篇博客
numpy 三種矩陣乘法
實(shí)驗(yàn)總結(jié)
很簡單的一個(gè)實(shí)驗(yàn),總時(shí)間加起來大致4個(gè)小時(shí)左右,做這么快的主要原因是,本來同學(xué)來哈爾濱找我玩,正玩得開心,結(jié)果突然告訴我這個(gè)實(shí)驗(yàn)要今天晚上交(之前以為這個(gè)實(shí)驗(yàn)還有一周的ddl),所以潛能爆發(fā),從三點(diǎn)寫到六點(diǎn)差不多就寫完了
總結(jié)
以上是生活随笔為你收集整理的python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue上传录音_vue用到H5+的录音功
- 下一篇: 应流股份是军工股吗