src:输入图,只能为单通道图像,通常是灰度图
dst:输出图
thresh:阈值
maxval:当像素值超过了阈值(或小于阈值,根据type来决定),所赋予的值
type:二值化操作类型
type:包含5种类型:cv2.THRESH_BINARY;cv2.THRESH_BINARY_INV;cv2.THRESH_TRUNC;cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV;
img_gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
ret, thresh1 = cv.threshold(img_gray, 217, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(img_gray, 217, 255, cv.THRESH_BINARY_INV)
ret, thresh3 = cv.threshold(img_gray, 217, 255, cv.THRESH_TRUNC)
ret, thresh4 = cv.threshold(img_gray, 217, 255, cv.THRESH_TOZERO)
ret, thresh5 = cv.threshold(img_gray, 217, 255, cv.THRESH_TOZERO_INV)
titles = ["Original image", "BINARY", "BINARY_INV", "TRUNC", "TOZERO", "TOZERO_INV"]
images = [img1, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。
绘图标记
颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,’#008000’ RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色。
线型参数:’‐’ 实线,’‐‐’ 破折线,’‐.’ 点划线,’:’ 虚线。
标记字符:’.’ 点标记,’,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,’^’ 上三角标记,’>’ 右三角标记,’<’ 左三角标记…等等。
x = np.array([0, 10, 10])
y = np.array([0, 100, 0])
# plt.plot(x, y, 'r')
plt.plot(x, y, 'o')
plt.plot(x, y, '--')
_y = np.array([3, 8, 1, 10, 5, 7])
## x 默认[0, 1, 2, ..., n - 1]
# 在 plt.plot() 参数中包含两对 x,y 值,第一对是 x,y,这对应于正弦函数,
# 第二对是 x,z,这对应于余弦函数。
x = np.arange(0, 4 * np.pi, 0.1) # start,stop,step
y = np.sin(x)
z = np.cos(x)
plt.plot(x,y,x,z)
使用 xlabel() 和 ylabel() 方法来设置 x 轴和 y 轴的标签。
使用 title() 方法来设置标题。
提供了 loc 参数来设置标题显示的位置,可以设置为: ‘left’, ‘right’, 和 ‘center’, 默认值为 ‘center’。
x = np.arange(0, 2 * np.pi, 0.2)
y = np.sin(x)
plt.title('sinx')
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y)
matplotlib.pyplot.grid(b=None, which=‘major’, axis=‘both’, **kwargs)
plt.grid(axis = 'y', color = 'r', linestyle = '--', linewidth = 0.5)
subplot() 和 subplots() 绘制多个子图。
subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。
subplot(nrows, ncols, index, **kwargs)
#plot 1:
x1 = np.array([0, 6])
y1 = np.array([0, 100])
plt.subplot(1, 2, 1)
plt.plot(x1, y1)
plt.title("plot 1")
#plot 2:
x2 = np.array([1, 2, 3, 4])
y2 = np.array([1, 4, 9, 16])
plt.subplot(1, 2, 2)
plt.plot(x2, y2)
plt.title("plot 2")
plt.suptitle("subplot Test")
plt.show()
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, …)
# 随机数生成器的种子
np.random.seed(20030121)
N = 30
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
sizes = (30 * np.random.rand(N))**2 # [0, 900)
# np.random.rand() -->> [0, 1) 随机数,服从均匀分布
plt.scatter(x, y, s=sizes, c=colors, cmap='viridis', alpha=0.5) # alpha = 透明度
plt.title("Scatter Test") # 设置标题
plt.colorbar() # 显示颜色条,cmap 默认 'viridis'
plt.show()
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align=‘center’, data=None, **kwargs)
水平方向:bar()
垂直方向:barh()
x = np.array(["a", "b", "c", "d"])
y = np.array([12, 22, 6, 18])
plt.subplot(1, 2, 1), plt.title('h'), plt.barh(x, y, color=["#4CAF50","red","hotpink","#556B2F"], height=0.5)
plt.subplot(1, 2, 2), plt.title('v'), plt.bar(x, y, color=["#4CAF50","red","hotpink","#556B2F"], width=0.5)
plt.suptitle('bar chart')
plt.show()
pie( … )
y = np.array([35, 25, 25, 15]) # 逆时针绘制
plt.pie(y,
labels=['A','B','C','D'], # 设置饼图标签
colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色
explode=(0, 0.2, 0, 0), # 第二部分突出显示,值越大,距离中心越远
autopct='%.2f%%', # 格式化输出百分比
)
plt.title("Pie Test")
也称模糊处理,常见用来减少图像上的噪点或者失真。
对目标像素及周边像素取平均值后再填会目标像素来实现滤波目的的方法。
# 均值滤波
blur = cv.blur(img1, (3, 3))
ksize = (5, 5)
blur = cv.blur(img1, ksize, cv.BORDER_DEFAULT)
若归一化,等价于均值滤波
若不归一,即截断在255
# 方框滤波
blur = cv.boxFilter(img1, -1, (3, 5))
高斯卷积核是一个近似服从高斯分布的矩阵,随着距离中心点的距离增加,其值变小。这样进行平滑处理时,图像矩阵中锚点处像素值权重大,边缘处像素值权重小。
下为一个3*3的高斯卷积核:
# 高斯滤波
dst = cv.GaussianBlur(img1, (3, 5), 1)
对于上面的高斯卷积核,可以由如下两个矩阵相乘进行构建,说明高斯核是可分离卷积核,因此高斯卷积操作可以分成先进行垂直方向的一维卷积,再进行一维水平方向卷积。
# 先知道有这么个函数
中值平滑也有核,但并不进行卷积计算,而是对核中所有像素值排序得到中间值,用该中间值来代替锚点值。中值平滑特别适合用来去除椒盐噪声。
img_median = cv.medianBlur(img1, 3)
## 白点噪声都被平滑掉了
双边滤波在平滑的同时还能保持图像中物体的轮廓信息。
双边滤波在高斯平滑的基础上引入了灰度值相似性权重因子,所以在构建其卷积核核时,要同时考虑空间距离权重和灰度值相似性权重。
在进行卷积时,每个位置的邻域内,根据和锚点的距离d构建距离权重模板,根据和锚点灰度值差异r构建灰度值权重模板,结合两个模板生成该位置的卷积核。
bilateralFilter = cv.bilateralFilter(img1, 0, 0.3, 20)
import numpy as np
np.hstack() # 矩阵进行水平连接
np.vstack() # 矩阵进行垂直连接
res = np.hstack((blur, dst, img_median, bilateralFilter))
# 均值, 高斯, 中值, 双边
腐蚀 & 膨胀
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。
cv2.erode(img, kernel, iterations)
进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。
kernel = np.ones((5, 5), np.uint8);
# 内核 np.ones((k,k), mp.uint8);
erosion = cv.erode(img2, kernel, iterations = 1)
plt.subplot(1, 2, 1), plt.imshow(img2)
plt.subplot(1, 2, 2), plt.imshow(erosion)
plt.show()
进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” 。
dilation = cv.dilate(erosion, kernel, iterations = 1)
plt.subplot(1, 2, 1), plt.imshow(erosion)
plt.subplot(1, 2, 2), plt.imshow(dilation)
plt.show()
## 腐蚀完进行膨胀
先腐蚀再膨胀,被用来去除噪声。
先膨胀再腐蚀,经常被用来填充前景物体中的小洞、小黑点。
opening = cv.morphologyEx(img, cv.MORPH_OPEN,kernel) # 开运算
closeing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) # 闭运算
膨胀图与腐蚀图之差,dilate - erode
保留物体的边缘轮廓,凸显边缘
pie = img3.copy()
# show('', pie)
kernel = np.ones((5, 5), np.uint8)
dilate = cv.dilate(pie, kernel, iterations = 5)
erosion = cv.erode(pie, kernel, iterations = 5)
res = np.hstack((dilate, erosion))
show('res', res)
gradient = cv.morphologyEx(pie, cv.MORPH_GRADIENT, kernel)
= 原始 - 开运算
tophat = cv.morphologyEx(img2, cv.MORPH_TOPHAT, kernel)
= 闭运算 - 原始
black = cv.morphologyEx(img2, cv.MORPH_BLACKHAT, kernel)
附上好文