基于OpenCV的传统视觉应用 -- OpenCV图像处理 图像模糊处理 图像锐化处理
图像处理
图像处理是用计算机对图像进行分析,以获取所需结果的过程,又称为影像处理。图像处理一般是指数字图像的处理。数字图像是用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。
图像模糊
均值滤波
均值滤波是指任意一点的像素值,都是周围 NxM 个像素值的均值。
指通过将图像与低通滤波器内核进行卷积来实现图像模糊,这对于消除噪声很有用。
OpenCv里可以用cv2.blur(img,(3,3)) 函数实现图像的均值滤波。
第二个参数(3,3)称为滤波核。
中值滤波
在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。
OpenCV里可以使用cv2.medianBlur(img,3)函数来实现
3为简写方式 ,与(3,3)是一样的。
高斯滤波
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值
cv2.GaussianBlur(source,(3,3),0)
第一个参数为图像对象
第二个参数为滤波核
第三个参数0为高斯核标准差
实例
import cv2
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体
mpl.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 均值滤波
img = cv2.imread('./dog.jpg', 0) # 第二个参数0 是设置为灰度图用的
blur = cv2.blur(img, (5, 5))
# 显示图像
plt.subplot(1, 2, 1)
plt.imshow(img, 'gray')
plt.title("zaosheng")
plt.subplot(1, 2, 2)
plt.imshow(blur, 'gray')
plt.title("blur")
plt.show()
# 中值滤波
img = cv2.imread("./dog.jpg", 0)
dst = cv2.medianBlur(img, (5)) # 卷积核大小为5
# 显示图像
plt.subplot(1, 2, 1)
plt.imshow(img, "gray")
plt.title("zaosheng")
plt.subplot(1, 2, 2)
plt.imshow(dst, 'gray')
plt.title("medianBlur")
plt.show()
# 高斯滤波
img = cv2.imread("./dog.jpg", 0)
m_dst = cv2.medianBlur(img, (5))
g_dst = cv2.GaussianBlur(img, (5, 5), 0) # 高斯核为5*5
# 显示图像
plt.subplot(1, 3, 1), plt.imshow(img, 'gray')
plt.title("zaosheng")
plt.subplot(1, 3, 2), plt.imshow(g_dst, 'gray')
plt.title('高斯')
plt.subplot(1, 3, 3), plt.imshow(m_dst, 'gray')
plt.title('medianBlur')
plt.show()
均值滤波
中值滤波
高斯滤波:
图像锐化
图像锐化是补偿图像的轮廓,以及增强图像的边缘和灰度跳变的部分,使图像变得清晰的操作,分为空间域处理和频处理两类。
图像锐化的目的是突出图像地物的边缘、轮廓,或者某些线性目标要素的特征。这邪恶滤波方法增强了地物边缘与周围像元之间的反差,因此也称为边缘增强。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
dog = cv.imread("./dog.jpg", 0)
# plt.imshow(dog, 'gray')
# plt.title("灰度图")
# plt.show()
dog_f = np.copy(dog)
dog_f = dog_f.astype("float")
# plt.imshow(dog_f, "gray")
# plt.title('灰度图2')
# plt.show()
row, column = dog.shape
gradient = np.zeros((row, column))
for x in range(row-1):
for y in range(column-1):
gx = abs(dog_f[x+1, y]-dog_f[x, y]) # 通过相邻像素相减计算图像梯度
gy = abs(dog_f[x, y+1]-dog_f[x, y])
gradient[x, y] = gx + gy
# plt.imshow(gradient, 'gray')
# plt.title("梯度图")
# plt.show()
# 叠加原图和梯度图 就能够实现图像锐化
# 将小于0 的像素设置为0 将大于255的像素设置为255
sharp = dog_f + gradient
sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp))
# 显示图像
gradient = gradient.astype("uint8")
sharp = sharp.astype("uint8")
plt.subplot(2, 2, 1), plt.imshow(dog), plt.title("原图")
plt.subplot(2, 2, 2), plt.imshow(dog_f, "gray"), plt.title("灰度图")
plt.subplot(2, 2, 3), plt.imshow(gradient, "gray"), plt.title("梯度图")
plt.subplot(2, 2, 4), plt.imshow(sharp, "gray"), plt.title("锐化图")
plt.show()
更多推荐
所有评论(0)