单阈值分割算法原理:
单阈值分割是指将一灰度图,大于阈值的像素白色表示,小于阈值的像素以黑色表示。或者颜色调换过来也可以。该方法找到一个阈值,如果像素低于阈值,就认为是背景,否则认为是目标的一部分。
一般流程:通过判断图像中每一个像素点的特征属性是否满足阈值的要求,来确定图像中的该像素点是属于目标区域还是背景区域,从而将一幅灰度图像转换成二值图像。用数学表达式来表示,则可设原始图像 f(x,y),T 为阈值,分割图像时则满足下式:
0是黑色,255是白色
如果图像中有多个灰度值不同的区域,那么可以选择一系列的阀值以将每个像素分到合适的类别中去。如果只用一个阀值分割称为单阀值方法。
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
最后一行代码:更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉代码依赖包:
matplotlib 3.4.2 numpy 1.20.3 opencv-python 4.1.2.30
# pip安装 pip install matplotlib numpy opencv-python
import cv2
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def put(path):
image = cv2.imread(path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转为灰度图
# 方法选择为THRESH_BINARY单阈值,150为阈值,小于阈值使用0表示。0是黑色,255是白色
ret1, th1 = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
plt.subplot(131), plt.imshow(image[:,:,::-1]) # img[:,:,::-1]转换是为了转回RGB格式,这样才可以正常显示彩色图像
plt.title("原图"),plt.axis('off')
plt.subplot(132), plt.imshow(gray, "gray")
plt.title("灰度图"),plt.axis('off')
plt.subplot(133), plt.imshow(th1, "gray")
plt.title("单阈值 " + str(ret1)),plt.axis('off')
# plt.savefig('2.new-img.jpg')
plt.show()
# 图像处理函数,要传入路径
put(r'../image/img5.jpg')
不同图片要取合适的阈值才好看