开发工具:pycharm
逻辑:
1、读取图像
2、灰度
3、二值
4、去噪
5、提取轮廓
代码:
import cv2
# 读取图像
img = cv2.imread('D:\\Demo2.TIF')
# 灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)
# 去噪
# 卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 腐蚀
eroded = cv2.erode(thresh, kernel)
# 膨胀
dilated = cv2.dilate(eroded, kernel)
# 轮廓检测
contours, hierarchy = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 1)
# 显示图像
cv2.imshow('img', img)
# 等待程序终止
cv2.waitKey(0)
cv2.destroyAllWindows()
知识点:
1、读取图像
cv2.imread读取到的图像默认是三通道图像(BGR),与我们平常的RGB是通道是相反的;
cv2.imread不能直接读取含有中文路径的图像,读取中文路径可用下面的代码:
cv2.imdecode(np.fromfile('文件路径', dtype=np.uint8), -1)
文件在项目内
1.与py文件同级目录可以只写文件名,
2.与py文件不同级,可以从根目录查找'./文件路径'
2、灰度
由于imread读到的是BGR图片,所以灰度时使用的是BGR转gray
常用的转换系数:
COLOR_BGR2GRAY BGR转灰度
COLOR_RGB2GRAY RGB转灰度
COLOR_BGR2RGB BGR转RGB
COLOR_RGB2BGR RGB转BGR
3、二值
常用的二值系数:
THRESH_BINARY 固定阈值
THRESH_BINARY_INV 固定阈值并翻转图像,比如白底图变为黑底图
THRESH_OTSU 自动适用最合适的阈值
任意系数 + THRESH_OTSU 在前面系数的基础上再适用最合适的阈值
举例代码:
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
ret, thresh = cv2.threshold(gray, 100, 200, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
此处如果第四行设置0,255,那么与第三行效果一致
4、去噪
此处用的是腐蚀+膨胀操作,这两步其实就是开运算的操作,闭运算就是膨胀+腐蚀
腐蚀:缩小,可去掉一些像素较小的点
膨胀:放大
5、提取轮廓
常用系数:
RETR_EXTERNAL 只提取外部最大轮廓
RETR_TREE 提取所有轮廓并带有父级关系
父级关系在hierarchy中,hierarchy是三维数组,父级关系在第三级的第三个参数上
举例代码:
for cnt in range(len(contours)):
# 判断是否有上级
if hierarchy[0][cnt][3] != -1:
print("有上级轮廓")
else:
print("没有上级轮廓")