实现
在高斯滤波中,对每一个元素而言,则用它周围邻域和自身的加权求和代替它自身的值,假设滤波核是3 × 3,a5为当前元素,它周围8联通的像素值分别是a1、a2、a3、a4、a6、a7、a8、a9,它对应的权值分别是w1、w2、w3、w4、w5、w6、w7、w8,w9,则有
import time
import cv2
import numpy as np
"""均值滤波、中值滤波、高斯滤波、图像锐化"""
'''
均值滤波的实现
path:图像路径
ksize:卷积核大小
'''
def Mean_blur(path, ksize):
time_start = time.time()
'''读取图像'''
image = cv2.imread(path, 1)
'''resize'''
height = 400
width = int(400 * image.shape[0] / image.shape[1])
image = cv2.resize(image, (height, width))
mean_img = np.copy(image) # 创建输出图像
'''计算均值滤波后的图像'''
# 没有计算边缘像素点数小于卷积核大小的部分
# 所占部分很小所以可以忽略
kernel = np.ones((ksize, ksize)) # 创建卷积核
for h in range(0, mean_img.shape[0] - ksize + 1):
for w in range(0, mean_img.shape[1] - ksize + 1):
for c in range(mean_img.shape[2]):
mean_img[h, w, c] = np.sum(kernel * mean_img[h:h + ksize, w:w + ksize, c]) // (ksize * ksize)
# 计时
time_end = time.time()
print(time_end - time_start, 's')
'''show'''
cv2.imshow('image', np.hstack((image, mean_img)))
cv2.waitKey(0)
'''
中值滤波的实现
path:图像路径
ksize:卷积核大小
'''
def Median_blur(path, ksize):
time_start = time.time()
'''读取图像'''
image = cv2.imread(path, 1)
'''resize'''
height = 400
width = int(400 * image.shape[0] / image.shape[1])
image = cv2.resize(image, (height, width))
'''计算中值滤波后的图像'''
median_img = np.copy(image) # 创建输出图像
# 没有计算边缘像素点数小于卷积核大小的部分
# 所占部分很小所以可以忽略
for h in range(0, median_img.shape[0] - ksize + 1):
for w in range(0, median_img.shape[1] - ksize + 1):
for c in range(median_img.shape[2]):
median_img[h, w, c] = np.median(median_img[h:h + ksize, w:w + ksize, c])
time_end = time.time()
print(time_end - time_start, 's') # 计时
'''show'''
cv2.imshow('image', np.hstack((image, median_img)))
cv2.waitKey(0)
'''
高斯滤波
卷积核:1 2 8
'''
def Gaussian_blur(path):
time_start = time.time()
'''读取图像'''
image = cv2.imread(path, 1)
'''resize'''
height = 400
width = int(400 * image.shape[0] / image.shape[1])
image = cv2.resize(image, (height, width))
gaussian_img = np.copy(image) # 创建输出图像
'''高斯滤波'''
kernel = np.array([
[1, 2, 1],
[2, 4, 2],
[1, 2, 1]
])
ksize = 3
for h in range(0, gaussian_img.shape[0] - ksize + 1):
for w in range(0, gaussian_img.shape[1] - ksize + 1):
for c in range(gaussian_img.shape[2]):
gaussian_img[h, w, c] = np.sum(kernel * gaussian_img[h:h + ksize, w:w + ksize, c]) // 16
# 计时器
time_end = time.time()
print(time_end - time_start, 's')
'''show'''
cv2.imshow('image', np.hstack((image, gaussian_img)))
cv2.waitKey(0)
'''
图像锐化的实现
path:图像路径
ksize:卷积核大小
'''
def Sharpen(path):
time_start = time.time()
'''读取图像'''
image = cv2.imread(path, 1)
'''resize'''
height = 400
width = int(400 * image.shape[1] / image.shape[0])
image = cv2.resize(image, (width, height))
kernel = np.array([
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]
])
ksize = 3
sharpen_ing = np.copy(image) # 创建输出图像
H, W, C = sharpen_ing.shape
# 没有计算边缘像素点数小于卷积核大小的部分
# 所占部分很小所以可以忽略
for h in range(0, H - ksize + 1):
for w in range(0, W - ksize + 1):
for c in range(0, 3):
sharpen_ing[h, w, c] = np.sum(kernel * sharpen_ing[h:h + ksize, w:w + ksize, c])
time_end = time.time()
print(time_end - time_start, 's') # 计时器
'''show'''
cv2.imshow('image', np.hstack((image, sharpen_ing)))
cv2.waitKey(0)
# Mean_blur("imgs/woman.jpg", 5)
# Median_blur("imgs/woman.jpg", 3)
Gaussian_blur("imgs/woman.jpg")
# Sharpen("imgs/img_4.png")