目录:
1. cv2.threshold
opencv: 阈值处理(cv2.threshold) 探究(图示+源码)
API定义:OpenCV 3.2.0 中,阈值处理的 api 定义如下:
cv2.threshold (src, thresh, maxval, type)
即:
cv2.threshold (源图片, 阈值, 填充色, 阈值类型)
参数:
- src:源图片,必须是单通道
- thresh:阈值,取值范围0~255
- maxval:填充色,取值范围0~255
- type:阈值类型,具体见下表
阈值 | types | 小于阈值的像素点 | 大于阈值的像素点 |
---|---|---|---|
0 | cv2.THRESH_BINARY | 置0 | 置填充色 |
1 | cv2.THRESH_BINARY_INV | 置填充色 | 置0 |
2 | cv2.THRESH_TRUNC | 保持原色 | 置灰色,threshold |
3 | cv2.THRESH_TOZERO | 置0 | 保持原色 |
4 | cv2.THRESH_TOZERO_INV | 保持原色 | 置0 |
举个例子:
下面例子实现的功能就是提取出里面颜色最白的部分
# Finding sure foreground area # Opencv中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离, # distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上 # 越亮的点,代表了离零点的距离越远。 dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5) # 本身不能完全显示,需要拉伸后显示 display(Image.fromarray((dist_transform*255/np.max(dist_transform)).astype('uint8'))) # 70%-100% 的大值变为 白色,255 # 0% - 70% 的小值变为 黑色,0 # sure foreground ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0) display(Image.fromarray(sure_fg.astype('uint8')))
2. cv2.distanceTransform
Opencv中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远。
该函数的参数设置挺迷的,就按照下面的例子就行,cv2.DIST_L2 为欧氏距离,实现的效果就是距离 0 点越远,值越大,从而将主体部分分离出来,如下图所示:
# Finding sure foreground area # Opencv中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离, # distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上 # 越亮的点,代表了离零点的距离越远。 dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5) # 本身不能完全显示,需要拉伸后显示 display(Image.fromarray((dist_transform*255/np.max(dist_transform)).astype('uint8')))
3. cv2.cvtColor
cv2.cvtColor()方法用于将图像从一种颜色空间转换为另一种颜色空间。最常用的就是彩色图片转为灰度图片。
用法:
cv2.cvtColor(src, code[, dst[, dstCn]])
参数:
- src: 它是要更改其色彩空间的图像。
- code: 它是色彩空间转换代码。
- cv2.COLOR_BGR2RGB:cv2读取的 BGR 格式转为 RGB 格式
- cv2.COLOR_RGB2GRAY:RGB 转 Gray
- cv2.COLOR_GRAY2RGB:Gray 转 RGB
- dst: 它是与src图像大小和深度相同的输出图像。它是一个可选参数。
- dstCn: 它是目标图像中的频道数。如果参数为0,则通道数自动从src和代码得出。它是一个可选参数。
返回值:它返回一个图像。
img = cv2.imread('seg_smooth.png') # 转为灰度的图,也是二值图,针对cv2读取的图像是 BGR 三通道 thresh = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)