Python实现高斯滤波

目录

一、导入库

二、读取图片并且转换成灰度图

三、制造一些噪声点

四、编写模板

五、高斯滤波及相关的编写

六、调用函数

七、显示并保存图片

八、完整代码

就不讲它的实现原理了,这里有个我觉得还比较清晰的文章,可以去看

(60条消息) 高斯滤波(Gauss filtering)_半壕春水的博客-CSDN博客

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

四、编写模板

了解滤波的同学都应该知道需要建立一个模板来遍历图像,这里我用的是根据高斯滤波原理中的

Python实现高斯滤波参数来计算模板的大小,因为希望大部分都在这个范围内,所以用的是(-3Python实现高斯滤波,3Python实现高斯滤波)
计算模板的大小以及模板
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)

Original: https://blog.csdn.net/qq_49979147/article/details/121664735
Author: 游鱼不知夏
Title: Python实现高斯滤波

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/761680/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球