目录
图像阈值
1. 函数 cv2.threshold()
简单阈值,选取一个全局阈值,然后就把整幅图像分成了非黑即白的二值图像了。
ret, dst = cv2.threshold(src, thresh, maxval, type)
该函数有两个返回值和四个参数:
ret:得到的阈值
dst: 输出图
src: 输入图,只能输入单通道图像,通常为灰度图
thresh: 阈值
maxval: 高于(低于)阈值时赋予的新值
type:二值化操作的类型,包含以下5种类型:
(1)cv2.THRESH_BINARY:大于阈值部分取255最大值,否则取0
(2)cv2.THRESH_BINARY_INV:THRESH_BINARY 的反转(即小于阈值取 255,否则取 0 )
(3)cv2.THRESH_TRUNC:大于阈值部分设为阈值,否则不变
(4)cv2.THRESH_TOZERO:大于阈值部分不改变,否则设为 0
(5)cv2.THRESH_TOZERO_INV:THRESH_TOZERO 的反转(小于阈值部分不改变,否则设为 0 )
2. 灰度图
前面我们学习到,在 imread() 中使用 cv2.IMREAD_GRAYSCALE 可得到灰度图像,
img=cv2.imread('sky.jpg',cv2.IMREAD_GRAYSCALE)
OpenCV 中也有自带的转换灰度的函数 cvtColor()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
注意:OpenCV 中默认的彩图通道排列是 BGR(蓝绿红)而不是 RGB
import cv2
img = cv2.imread("szj.jpg") #读取
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转化成灰度图
cv2.imshow("img_gray",img_gray) #显示图像
cv2.waitKey(0) #按任意键关闭图像
cv2.destroyAllWindows()
3. 实例
分别使用二值化操作的五种类型,输出图像:
ret, pic1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, pic2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, pic3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, pic4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, pic5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, pic1, pic2, pic3, pic4, pic5]
for i in range(6):
plt.subplot(2, 3, i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
#plt.xticks(ticks, [labels], **kwargs) 参数x是X轴的间隔,第二个参数控制每个间隔显示的文本
plt.xticks([]), plt.yticks([]) #不显示x/y轴信息
plt.show()
4. plt.xticks/plt.yticks
#.xticks例子
import numpy as np
import matplotlib.pyplot as plt
import calendar
x = range(1,13,1)
y = range(1,25,2)
plt.plot(x,y)
#第一个参数:间隔,第二个参数:月份,后面两个参数:控制标签的颜色和旋转角度
plt.xticks(x,calendar.month_name[1:13],color='red',rotation=50)
plt.show()
图像平滑
为了抑制图像噪声(亮点),使图像亮度趋于平缓的处理方法就是图像平滑。图像平滑实际上是低通滤波,平滑过程会导致图像边缘模糊化。
1. 均值滤波(线性)
均值滤波是最简单的一种线性滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值。
优势: 算法比较简单,计算速度快,对周期性的干扰噪声有很好的抑制作用。
不足: 图像去噪时破坏了图像的细节部分,使图像变得模糊,去除噪声点较差
2. 方框/盒式滤波(线性)
基本和均值一样,当 normalize = true 时,方框滤波就变成了均值滤波。即均值滤波是方框滤波归一化后的特殊情况。当 normalize = false时,为非归一化的方框滤波。
3. 高斯滤波(线性)
高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
优势: 适用于消除高斯噪声,广泛应用于图像处理的减噪过程,对于抑制服从正态分布的噪声非常有效。
不足: 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的。
4. 中值滤波(非线性)
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
优势: 对消除椒盐噪声非常有效,常用于用来保护边缘信息。
不足: 在光学测量条纹中心分析方法中作用不大。
5.双边滤波(非线性)
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
优势: 可以做边缘保存。
不足: 对于高频细节的保护效果并不明显。
6.引导/导向滤波(非线性)
导向滤波是一种图像滤波技术,通过一张引导图 G,对目标图像 P(输入图像)进行滤波处理,使得最后的输出图像大体上与目标图像 P 相似,但是纹理部分与引导图 G 相似。保边图像平滑,抠图。
代码
import cv2
import numpy as np
img = cv2.imread("szj.jpg")
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) #图像缩小一半
#均值滤波
blur = cv2.blur(img,(3,3)) #卷积核大小3*3
#方框滤波
#(默认)-1表示得到的结果与输入的颜色通道一致;
# normalize=True表示做归一化,与均值滤波一样;
#normalize=False表示直接九个元素相加,不取均值,如果加和后的值大于255,使用255表示
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
#高斯滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
#中值滤波
median = cv2.medianBlur(img,5)
#双波滤波
#d:像素的邻域直径;sigmaColor:颜色空间的标准方差,一般尽可能大;
#sigmaSpace:坐标空间的标准方差(像素单位),一般尽可能小
bilateral = cv2.bilateralFilter(img, d=0, sigmaColor=100, sigmaSpace=5)
# 展示所有的
# np.vstack():在竖直方向上堆叠,np.hstack():在水平方向上平铺
res = np.hstack((img,blur,box,gaussian,median,bilateral))
cv2.imshow("picture_szj",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
本笔记记录学习OpenCV,若有错误,欢迎批评指正,学习交流。