import cv2 as cv
from pylab import *
from scipy import ndimage
import matplotlib.pyplot as plt
import random
# .......................................................................................
# ..................................我是分界線.............................................
# .......................................................................................
def pepper_and_salt(img,percentage): # 第一個參量為輸入的圖片,第二個是噪聲占圖片像素的百分比
num = int(percentage*img.shape[0]*img.shape[1]) # 計算椒鹽噪聲點數量
random.randint(0, img.shape[0]) # 引數1、引數2必須是整數函式;回傳值是引數1和引數2之間的任意整數生成隨機位置
img2 = img.copy() # 淺度復制,復制的數不會隨著被復制數的嵌套序列的元素的改變而改變;
for i in range(num):
X=random.randint(0,img2.shape[0]-1) # 從0到影像長度之間的一個隨機整數,因為是閉區間所以-1
Y=random.randint(0,img2.shape[1]-1)
if random.randint(0,1) ==0: # 黑白色概率55開
img2[X,Y] = (255,255,255) # 白色
else:
img2[X,Y] =(0,0,0) # 黑色
return img2
# ..................................我是分界線.............................................
if __name__ == '__main__':
#對自備圖片進行均值濾波
plt.ion()
# 讀取圖片
img = cv.imread("g07.tif") # pycharm檔案和圖片在同一個檔案夾里,故可直接寫圖片名稱來表示路徑
# 加入噪音
img = pepper_and_salt(img, 0.01)
source = cv.cvtColor(img, cv.COLOR_BGR2RGB) # 顏色空間轉換函式
# 均值濾波
result = cv.blur(source, (5, 5)) # 以周圍5x5的像素值為依據進行濾波,越大越模糊
# 顯示圖形
titles = ['Source Image', 'Blur Image']
images = [source, result]
for i in range(2): # 將兩個圖合并為一個圖輸出
plt.subplot(1, 2, i + 1) # plt.subplot(i,j,n)形式,其中ij是行列數,n是第幾個圖
plt.imshow(images[i]) # 對影像進行處理,并顯示其格式,
plt.title(titles[i]) # 設定影像標題
plt.xticks([]), plt.yticks([])
plt.show() # plt.show則是將plt.imshow處理后的函式顯示出來
plt.pause(3) # 該句顯示圖片3秒
plt.close() # 清空視窗
# 高斯模糊模板與均值模板比較
kernel_3X3 = np.array([ # 產生二維陣列
[1/16, 2/16, 1/16],
[2/16, 4/16, 2/16],
[1/16, 2/16, 1/16],
])
gray = cv.cvtColor(source, cv.COLOR_BGR2GRAY) # 將彩色圖片變為灰度圖
out = cv.GaussianBlur(gray, (3, 3), 1.3) # cv庫自帶的高斯模糊——3X3模板 標準差為 1.3
cv.imshow('GaussianBlur', out) # 高斯模糊處理后的圖片顯示
kernel_3X3 = kernel_3X3/kernel_3X3.sum() # .sum()是對序列進行求和,在這里這段代碼無意義
k = ndimage.convolve(gray, kernel_3X3, mode='constant', cval=0.0) # 卷積
# ndimage.convolve()第一個引數表示輸入的一維陣列,第二個引數是輸入的二維陣列
# mode='reflect'(默認值),外部值會反映在輸入的邊以填充缺失值,
# mode='constant', cval=0.0表示邊界補0;mode='constant', cval=1.0表示邊界補1
cv.imshow("Blur", k) # 圖片顯示
cv.waitKey(5000)
cv.destroyAllWindows()
#添加椒鹽噪聲
img = cv.imread("g07.tif")
img1 = pepper_and_salt(img, 0.05) # 百分之5的椒鹽噪音
img_median = cv.medianBlur(img1, 3) # 中值濾波
htitch = np.hstack((img1, img_median)) # 將添加噪聲的圖和中值濾波后的圖合并到一起顯示
cv.imshow("pepper_and_salt", htitch)
cv.waitKey(5000)
cv.destroyAllWindows()
二、圖象平滑
1,對自備圖片(封面圖圖)進行均值濾波(自選模板大小)
2,對自備圖片利用二維高斯模板,對其進行加權平滑濾波,并比較其效果;二維高斯模板為:

3,對自備影像之一添加椒鹽噪聲,再進行中值濾波;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302042.html
標籤:其他
