图像中值滤波器python实现
生活随笔
收集整理的這篇文章主要介紹了
图像中值滤波器python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
中值濾波器原理
圖像處理中最著名的統計排序濾波器是中值濾波器,即用一個預定義的像素領域中的灰度中值來代替像素的值:
其中是以(x,y)為中心的領域,包含中心點自己,在領域中找到中值,并用中值代替中心點的像素值。例如,對于圖像中的一個像素點a,其灰度值為6,我們取大小為3×3的領域,灰度值如下表所示:
| 1 | 2 | 3 |
| 7 | 6 | 99 |
| 8 | 5 | 4 |
我們進行排序后發現其中值為5,故使用5來代替原來的灰度值6。很顯然,在小區域內正常像素差距較小,故使用中值替代時所造成的差異較小,但是中值濾波器能很好的降低某些隨機噪聲,例如上例中的99,尤其對于椒鹽噪聲有很好的濾除效果。
Python實現
import cv2 import numpy as np import matplotlib.pyplot as pltdef noise(img, snr):h = img.shape[0]w = img.shape[1]img1 = img.copy()sp = h * w # 計算圖像像素點個數NP = int(sp * snr)randx = 1randy = 1 # 計算圖像椒鹽噪聲點個數for i in range(NP):while (img1[randx, randy] == 0 or img1[randx, randy]== 255):# 確保隨機得到的像素沒有被污染randx = np.random.randint(1, h - 1) # 生成一個 1 至 h-1 之間的隨機整數randy = np.random.randint(1, w - 1) # 生成一個 1 至 w-1 之間的隨機整數if np.random.random() <= 0.5: # np.random.random()生成一個 0 至 1 之間的浮點數img1[randx, randy] = 0 # 隨機放置椒噪聲、鹽噪聲else:img1[randx, randy] = 255return img1def median(img, size): # img為輸入圖像 size為中值濾波器大小height = img.shape[0]wide = img.shape[1]img1 = np.zeros((height, wide), np.uint8) # 用于存放新的圖像for i in range(int(size/2), height - int(size/2)):for j in range(int(size/2), wide - int(size/2)):Adjacent_pixels = np.zeros(size * size, np.uint8)s = 0for k in range(-1 * int(size / 2), int(size / 2)+1):for l in range(-1 * int(size / 2), int(size / 2)+1):Adjacent_pixels[s] = img[i + k, j + l]s += 1Adjacent_pixels.sort() # 尋找中值median = Adjacent_pixels[int((size * size - 1) / 2)] # 將中值代替原來的中心值img1[i, j] = medianreturn img1image = cv2.imread(r'11.jpg', cv2.IMREAD_GRAYSCALE) print(image)imagen = noise(image, 0.23) # 添加噪聲plt.subplot(1, 3, 1) plt.imshow(image, plt.cm.gray) plt.title('original') plt.subplot(1, 3, 2) plt.imshow(imagen, plt.cm.gray) plt.title('noise') image1 = median(imagen, 5) plt.subplot(1, 3, 3) plt.imshow(image1, plt.cm.gray) plt.title('median') plt.show()實現結果
可以看出,中值濾波器對椒鹽噪聲的去除效果強差人意。
總結
以上是生活随笔為你收集整理的图像中值滤波器python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各GIS软件添加天地图方式
- 下一篇: Python AutoCAD 图层