1. 程式人生 > 程式設計 >Python實現中值濾波去噪方式

Python實現中值濾波去噪方式

中值濾波器去噪:

中值濾波的主要原理是將數字影象中的某點用該點的鄰域中各個畫素值的中值所來代替,這樣就能讓目標畫素周圍能夠更好的接近真實值,比如一張白紙上有一個黑點時,黑點的畫素值比較大,經過中值濾波過後,黑點附近的畫素值可能就會變小。經過中值濾波後一些相對孤立的噪聲點就容易被清除掉,這樣就能提高影象的質量。

所以中值濾波器去噪的一個優點就是對椒鹽噪聲的去除具有很好的效果,具體操作是選取一箇中心鄰域,然後給鄰域類各個畫素的灰度值按大小進行排序,選取排序序列中的中值作為該鄰域中心點的畫素值的灰度值。

它的缺點是當鄰域挑選過大時,可能會造成影象特徵丟失。

實現程式碼如下:

import numpy as np
import cv2
from PIL import Image
import scipy.signal as signal
import matplotlib.pyplot as plt
#建立一個500*500的矩陣
input_images = np.zeros((500,500))
filename = "E:/pycharm/GraduationDesign/Test/testtwo.png"
#convert將當前影象轉換為灰度模式,並且返回新的影象。
#將圖片在重新定義的矩陣中再顯示,不然可能會只顯示部分。
img = Image.open(filename).resize((500,500)).convert('L')
plt.subplot(221)
plt.title('原圖',fontproperties=font_set)
plt.imshow(img)
#影象的尺寸,按照畫素數計算。它的返回值為寬度和高度的二元組(width,height)。
width = img.size[0]
height = img.size[1]
threshold=130
#可以改寫程式碼使其成為二值化,此程式碼可理解為反向二值化
for h in range(height):
 for w in range(width):
  #getpixel直接獲得(h,w)處的畫素直接返回這個點三個通道的畫素值
  #返回給定位置的畫素值。如果影象為多通道,則返回一個元組(r,g,b,閾值)。
  #如果改成(w,h)出現的影象會倒轉
  if img.getpixel((w,h)) < threshold:
 
   input_images[h,w] = 1
  else:
   input_images[h,w] = 0
plt.subplot(222)
plt.title('二值化',fontproperties=font_set)
plt.imshow(input_images)
 
data = signal.medfilt2d(np.array(img),kernel_size=3) # 二維中值濾波
for h in range(0,height):
 for w in range(0,width):
  if data[h][w] < 128:
   input_images[h,w] = 0
  else:
   input_images[h,w] = 1
 
plt.subplot(223)
plt.title('中值濾波去噪(3*3)',kernel_size=7) # 二維中值濾波
for h in range(0,w] = 1
plt.subplot(224)
plt.title('中值濾波去噪(7*7)',fontproperties=font_set)
plt.imshow(input_images)
plt.show()

效果圖:

圖中的小黑點是我簡單模擬實現圖片中含有椒鹽噪聲中所加入的。當中值濾波領域選取過大時會使圖片失真。

以上這篇Python實現中值濾波去噪方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。