在从事计算机视觉项目中,需要用到图像预处理,以帮助改善我计划构建的机器学习模型。图像预处理包括将图像滤镜应用于图像,本文将比较一些最知名的图像滤镜(也叫过滤器)。图像过滤器可用于减少图像中的噪声量并增强图像中的边。图像中可能存在两种类型的噪声:斑点噪声和胡椒盐噪声。斑点噪声是在图像采集期间产生的噪声,而胡椒盐噪声(指稀疏出现的白色和黑色像素)是由图像信号的突然干扰引起的。而增强图像的边可以帮助模型检测图像的特征。图像预处理步骤可以提高机器学习模型的准确性。与在未经预处理的图像上训练的更复杂的模型相比,经过预处理的图像可以提高基本模型的准确性。对于Python,Open-CV和PIL软件包允许您应用多个数字滤波器。应用数字滤波器涉及对图像与核(小矩阵)进行卷积。(注:核是一个n x n方阵其中n是一个奇数)。图1显示用于3 x 3平均滤波器的核。来自KDEF数据集的图像将用于数字滤波器示例。
1.均值过滤器
均值滤波器用于模糊图像以消除噪声。它涉及确定n x n核范围内像素值的平均值。然后,将中心元素的像素强度替换为平均值。这样可以消除图像中的某些噪点并平滑图像的边。 Open-CV库中的模糊函数可用于将均值滤镜应用于图像。
import numpy as np
import cv2
from matplotlib import pyplot as plt
from PIL import Image, ImageFilter
%matplotlib inline
image = cv2.imread('AM04NES.JPG') # reads the image
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # convert to HSV
figure_size = 9 # the dimension of the x and y axis of the kernal.
new_image = cv2.blur(image,(figure_size, figure_size))
plt.figure(figsize=(11,6))
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_HSV2RGB)),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(new_image, cv2.COLOR_HSV2RGB)),plt.title('Mean filter')
plt.xticks([]), plt.yticks([])
plt.show()
# first a conservative filter for grayscale images will be defined.
def conservative_smoothing_gray(data, filter_size):
temp = []
indexer = filter_size // 2
new_image = data.copy()
nrow, ncol = data.shape
for i in range(nrow):
for j in range(ncol):
for k in range(i-indexer, i+indexer+1):
for m in range(j-indexer, j+indexer+1):
if (k > -1) and (k < nrow): if (m > -1) and (m < ncol): temp.append(data[k,m]) temp.remove(data[i,j]) max_value = max(temp) min_value = min(temp) if data[i,j] > max_value:
new_image[i,j] = max_value
elif data[i,j] < min_value:
new_image[i,j] = min_value
temp =[]
return new_image.copy()
dft = cv2.dft(np.float32(image2),flags = cv2.DFT_COMPLEX_OUTPUT)
# shift the zero-frequncy component to the center of the spectrum
dft_shift = np.fft.fftshift(dft)
# save image of the image in the fourier domain.
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
# plot both images
plt.figure(figsize=(11,6))
plt.subplot(121),plt.imshow(image2, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
对于每次迭代:
a)暗像素调整:针对四个方向中的每个方向
1)使用以下方法处理整个图像:if a ≥ b+2 then b = b + 1
2)使用以下方法处理整个图像:if a > b and b ≤ c then b = b + 1
3)使用以下方法处理整个图像:if c > b and b ≤ a then b = b + 1
4)使用以下方法处理整个图像:if c ≥ b+2 then b = b + 1
b)亮像素调整:针对四个方向的每个方向
1)使用以下方法处理整个图像: if a ≤ b — 2 then b = b — 1
2)使用以下方法处理整个图像:if a < b and b ≥ c then b = b — 1
3)使用以下方法处理整个图像:if c < b and b ≥ a then b = b — 1
4)使用以下方法处理整个图像:if c ≤ b — 2 then b = b — 1