Opencv 阈值与平滑处理
import cv2 # opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt # matplotlib是RGB
% matplotlib inline
2.1 灰度图
img = cv2.imread('cat.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2gray)
img_gray.shape() # (414, 500)
cv2.imshow('img_gray', img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 HSV
# 将图像从 BGR(蓝、绿、红)颜色空间转换为 HSV(色相、饱和度、明度)颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3 图像阈值
ret, dst = cv2.threshold(src, thresh, maxval, type)
- src:输入图,只能输入单通道图像,通常来说为灰度图
- dst:输出图
- thresh:阈值
- maxval:当图像超过阈值(或者小于阈值,根据type来决定)所赋予的值
- type:二值化操作的类型
- cv2.THRESH_BINARY:超过阈值部分取maxval(最大值),否则取0
- cv2.THRESH_BINARY_INV:超过阈值的设为0,否则不改变
- cv2.THRESH_TRUNC:大于阈值部分设为阈值,否则不变
- cv2.THRESH_TOZERO:大于阈值部分不改变,否则设为0
- cv2.THRESH_TOZERO_INV:大于阈值设为0,否则不改变
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.show()
2.4 图像平滑
图像平滑处理是图像处理中的重要技术,旨在通过减少图像中的噪声和细节,使图像看起来更加平滑和连续。
img = cv2.imread('lenaNoise.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如图有很多噪音点
2.4.1 均值滤波
原理:通过计算每个像素及其邻域内像素的平均值来替换该像素的值。
效果:能够有效去除随机噪声,但可能会导致图像边缘模糊。
# 使用3×3的均值滤波器
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows
2.4.2 方框滤波
基本和均值滤波一样,可以选择归一化,容易越界
# -1 表示输出图像与输入图像具有相同的深度
box = cv2.boxFilter(img, -1, (3, 3), normalize = False)
"""
normalize用于指定是否对卷积核进行归一化处理。
当为True时该滤波器为均值滤波
当为False时该滤波器为方框滤波
"""
2.4.3 高斯滤波
原理:使用高斯函数对图像进行加权平均,权重与像素距离中心点的距离成反比。
效果:比均值滤波更好地保留图像的边缘信息。
# 高斯滤波的卷积核里的数值是满足高斯分布,相当于更重视中间的
gussian = cv2.GuassianBlur(img, (5, 5), 1)
# 1表示x方向上的高斯核标准差
cv2.imshow('gussian', gussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.4.4 中值滤波
原理:将每个像素值替换为其邻域内的中值。
效果:特别适用于去除椒盐噪声,同时保留边缘信息。
# 5表示使用5×5矩阵
median = cv2.medianBlur(img, 5)
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
展示所有处理后图像
# horizontal 水平方向展示
# vstack,vertical,垂直方向展示
res = np.hstack((blur, gussian, median))
cv2.imshow('blur vs gussian vs median', res)
cv2.waitKet(0)
cv2.destroyAllWindows()