目录
一、导入库
二、读取图片并且转换成灰度图
三、制造一些噪声点
四、编写模板
五、高斯滤波及相关的编写
六、调用函数
七、显示并保存图片
八、完整代码
就不讲它的实现原理了,这里有个我觉得还比较清晰的文章,
Python里面是有相应的高斯滤波实现库的,但是由于我们的作业要求不能用,所以就自己来实现。
一、导入库
import cv2
import numpy as np
import math
import random
二、读取图片并且转换成灰度图
因为用cv2读取图片的结果好像都是彩色图,所以建议一定要先转换成灰度
# 读取图像
imag = cv2.imread('3.jpg')
imag = cv2.cvtColor(imag, cv2.COLOR_BGR2GRAY)
[a, b] = imag.shape
三、制造一些噪声点
这里我的噪声比较粗糙,是简单的椒盐噪声,喜欢其他的可以改成其他的
# 制造噪声
for i in range(30):
x = random.randint(0, a)
y = random.randint(0, b)
imag[x, y] = 0
四、编写模板
了解滤波的同学都应该知道需要建立一个模板来遍历图像,这里我用的是根据高斯滤波原理中的
参数来计算模板的大小,因为希望大部分都在这个范围内,所以用的是(-3
,3
)
# 计算模板的大小以及模板
def compute(delta):
k = round(3 * delta) * 2 + 1
print('模的大小为:', k)
H = np.zeros((k, k))
k1 = (k - 1) / 2
for i in range(k):
for j in range(k):
H[i, j] = (1 / (2 * 3.14 * (delta ** 2))) * math.exp((-(i - k1) ** 2 - (j - k1) ** 2) / (2 * delta ** 2))
k3 = [k, H]
print(H)
print(sum(sum(H)))
return k3
五、高斯滤波及相关的编写
# 相关
def relate(a, b, k):
n = 0
sum1 = np.zeros((k, k))
for m in range(k):
for n in range(k):
sum1[m, n] = a[m, n] * b[m, n]
return sum(sum(sum1))
# 高斯滤波
def fil(imag, delta=0.7):
k3 = compute(delta)
k = k3[0]
H = k3[1]
k1 = (k - 1) / 2
[a, b] = imag.shape
k1 = int(k1)
new1 = np.zeros((k1, b))
new2 = np.zeros(((a + (k - 1)), k1))
imag1 = np.r_[new1, imag]
imag1 = np.r_[imag1, new1]
imag1 = np.c_[new2, imag1]
imag1 = np.c_[imag1, new2]
y = np.zeros((a, b))
sum2 = sum(sum(H))
for i in range(k1, (k1 + a)):
for j in range(k1, (k1 + b)):
y[(i - k1), (j - k1)] = relate(imag1[(i - k1):(i + k1 + 1), (j - k1):(j + k1 + 1)], H, k) / sum2
return y
六、调用函数
一定要先转换成uint8!不然没有办法显示
# 滤波
imag2 = fil(imag)
imag2 = np.array(imag2, dtype='uint8')
七、显示并保存图片
这里的1.jpg是灰度化后并且加了噪声的图片,2.jpg是最后的结果,你们也可以自己取文件名,而'1','2'是显示的窗口的名字,用于区分就好,你们也可以改成其他的
# 显示并保存图像
cv2.imshow('1', imag)
cv2.imwrite('1.jpg', imag)
cv2.imwrite('2.jpg', imag2)
cv2.imshow("2", imag2)
八、完整代码
注意事项:如果你们要运行我的代码,首先改你保存的图片的路径,还有你想存储的图片名和路径
# filter.py
import cv2
import numpy as np
import math
import random
# 计算模板的大小以及模板
def compute(delta):
k = round(3 * delta) * 2 + 1
print('模的大小为:', k)
H = np.zeros((k, k))
k1 = (k - 1) / 2
for i in range(k):
for j in range(k):
H[i, j] = (1 / (2 * 3.14 * (delta ** 2))) * math.exp((-(i - k1) ** 2 - (j - k1) ** 2) / (2 * delta ** 2))
k3 = [k, H]
print(H)
print(sum(sum(H)))
return k3
# 相关
def relate(a, b, k):
n = 0
sum1 = np.zeros((k, k))
for m in range(k):
for n in range(k):
sum1[m, n] = a[m, n] * b[m, n]
return sum(sum(sum1))
# 高斯滤波
def fil(imag, delta=0.7):
k3 = compute(delta)
k = k3[0]
H = k3[1]
k1 = (k - 1) / 2
[a, b] = imag.shape
k1 = int(k1)
new1 = np.zeros((k1, b))
new2 = np.zeros(((a + (k - 1)), k1))
imag1 = np.r_[new1, imag]
imag1 = np.r_[imag1, new1]
imag1 = np.c_[new2, imag1]
imag1 = np.c_[imag1, new2]
y = np.zeros((a, b))
sum2 = sum(sum(H))
for i in range(k1, (k1 + a)):
for j in range(k1, (k1 + b)):
y[(i - k1), (j - k1)] = relate(imag1[(i - k1):(i + k1 + 1), (j - k1):(j + k1 + 1)], H, k) / sum2
return y
# 读取图像
imag = cv2.imread('3.jpg')
imag = cv2.cvtColor(imag, cv2.COLOR_BGR2GRAY)
[a, b] = imag.shape
# 制造噪声
for i in range(30):
x = random.randint(0, a)
y = random.randint(0, b)
imag[x, y] = 0
# 滤波
imag2 = fil(imag)
imag2 = np.array(imag2, dtype='uint8')
# 显示并保存图像
cv2.imshow('1', imag)
cv2.imwrite('1.jpg', imag)
cv2.imwrite('2.jpg', imag2)
cv2.imshow("2", imag2)