SciPy - 濾波 與 圖像去噪


濾波

濾波常用於降噪;

濾波有多種,中值濾波,均值濾波,等等,說的很高大上,其實很簡單,各種濾波原理類似。

中值濾波為例,把 每一點的數據該點指定鄰域內數的中位數 代替

如 數據 [1,8,3],鄰域大小為3,則8經過濾波后是3,[1,3,8]的中位數;數據可以是多維的,鄰域也可以為多維;

其過程類似卷積

python 中值濾波函數為 scipy.signal.medfilt(signal, kernel_size),第一個參數為信號值,第二個參數為滑框大小,注意第二個參數必須為奇數,即左+1+右;

如果滑框內沒數據,以 0 填充

 

import random
import numpy as np
import scipy.signal as signal

# 一維中值濾波
x=np.arange(0,100,10)
random.shuffle(x)
print x
# [70 20 10 30 40  0 60 80 90 50]
print signal.medfilt(x,3)   # 一維中值濾波
# [20. 20. 20. 30. 30. 40. 60. 80. 80. 50.]


# 二維中值濾波
x=np.random.randint(1,1000,(4,4))
print x
# [[711  77 365 518]
#  [987 621 734  19]
#  [652 370 615 467]
#  [852 420 880 175]]
print signal.medfilt(x,(3,3))
# [[  0. 365.  77.   0.]
#  [370. 621. 467. 365.]
#  [420. 652. 467. 175.]
#  [  0. 420. 370.   0.]]

二維中值濾波還可以用 signal.medfilt2d(),速度快,但只支持 int8,float32,float64

 

滑框維度總是可以為1,如果大於1,其維度必須等於信號維度

也就是說,如果信號為3維,滑框必須為3維

 

圖像去噪

濾波常用於圖像預處理

import numpy as np
from PIL import Image
import scipy.signal as signal


im=Image.open('test2.png')   # 讀入圖片並建立Image對象im
# im=im.convert('L')          # 轉為灰度圖
data=[]                     # 存儲圖像中所有像素值的list(二維)
width,height=im.size        # 圖片尺寸,長寬,或者說寬高-->橫豎
print(width, height)

# 讀取圖像像素的值
for w in range(width):      # 對每個行號h
    row=[]                  # 記錄每一行像素
    for h in range(height): # 對每行的每個像素列位置w
        value=im.getpixel((w, h))    # 用getpixel讀取這一點像素值
        row.append(value)            # 把它加到這一行的list中去
    data.append(row)        # 把記錄好的每一行加到data的子list中去,就建立了模擬的二維list

### 彩色圖濾波
# data=signal.medfilt(data,kernel_size=3)           # 二維中值濾波
# data=signal.medfilt(data,kernel_size=5)
data=signal.medfilt(data,kernel_size=(3, 3, 3))

### 灰度圖濾波
##1
# data=signal.medfilt(data,kernel_size=(3, 3))
##2
# data = np.uint8(data)
# data=signal.medfilt2d(data,kernel_size=(11, 11))

#
data=np.int32(data)                         # 轉換為int類型,以使用快速二維濾波
# data=np.int8(data)
print(data)

# 創建並保存結果
for w in range(width):       # 對每一行
    for h in range(height):  # 對該行的每一個列號
        im.putpixel((w,h),tuple(data[w][h])) # 將data中該位置的值存進圖像,要求參數為tuple
        # im.putpixel((w,h),data[w][h])       # 灰度圖的處理方式

im.save('result2.jpg')       # 存儲

圖1 為原圖;圖2 使用 領域為3的中值濾波處理;圖3 使用 領域為5的中值濾波處理

 

當使用中值濾波處理圖片時,圖像的邊緣可能變得模糊,領域越大,越模糊。

圖3 的邊緣就比 圖1 模糊。

 

也就是說濾波對圖像的有去躁和模糊的作用。

 

 

 

參考資料:

https://blog.csdn.net/shu15121856/article/details/76273137

https://blog.csdn.net/qq_38131594/article/details/80758567

https://blog.csdn.net/qinghuaci666/article/details/81737624


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM