目录
[一 涉及的OpenCV函数](#一 涉及的OpenCV函数)
[二 代码](#二 代码)
[三 效果图](#三 效果图)
一 涉及的OpenCV函数
python
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
- image:源图像。
- mode:轮廓的检索方式。cv2.RETR_EXTERNAL(只 检测外轮廓)、cv2.RETR_LIST (检测的轮廓不建立 等级关系)、cv2.RETR_CCOMP(建立两个等级 的轮廓,上面的一层为外边界 ,里面的一层为内孔的边界 信息)、cv2.RETR_TREE(建立一个等级树结构的轮廓)。
- method:一般用 cv2.CHAIN_APPROX_SIMPLE,表示用尽可能少的像素点表示轮廓。cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1。
- contours:图像轮廓坐标。list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
- hierarchy:返回值,包含有关图像轮廓的拓扑信息。[Next, Previous, First Child, Parent]。
二 代码
python
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
b, g, r = cv2.split(img)
img_rgb = cv2.merge([r, g, b])
return img_rgb
def dealImageResult(img_path):
img = cv2.imread(img_path)
img_copy = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# OTSU方法实现前景与背景分割
ret2, dst_OTSU = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(dst_OTSU, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contourPic = cv2.drawContours(img_copy, contours, -1, (0, 255, 0), 3)
fig = plt.figure(figsize=(8, 8))
titles = ["img", "gray", "OTSU", "contourPic"]
img = dealImg(img)
contourPic = dealImg(contourPic)
images = [img, gray, dst_OTSU, contourPic]
for i in range(4):
plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("1.png")
pass
三 效果图
前文回顾