opencv骨架提取(opencv骨架提取算法函数)
## OpenCV 骨架提取### 简介骨架提取,也称为细化,是图像处理中一个重要的操作,它将图像简化为其中心线或骨架,保留了图像的形状信息,同时减少了数据量。这在许多应用中都很有用,比如字符识别、形状分析、医学图像处理等。OpenCV 提供了一系列用于骨架提取的函数,本文将详细介绍几种常用的方法。### 1. 距离变换与细化算法#### 1.1 距离变换距离变换是骨架提取的第一步,它计算图像中每个像素点到最近的非零像素点的距离。OpenCV 提供了 `cv2.distanceTransform()` 函数实现这一功能。```python import cv2 import numpy as np# 加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 计算距离变换 dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)# 显示距离变换结果 cv2.imshow('Distance Transform', dist) cv2.waitKey(0) cv2.destroyAllWindows() ```#### 1.2 细化算法距离变换完成后,需要使用细化算法提取骨架。OpenCV 提供了 `cv2.thinning()` 函数实现这一功能。```python import cv2 import numpy as np# 加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 计算距离变换 dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)# 细化图像 skeleton = cv2.ximgproc.thinning(dist)# 显示骨架结果 cv2.imshow('Skeleton', skeleton) cv2.waitKey(0) cv2.destroyAllWindows() ```### 2. 形态学骨架提取OpenCV 提供了形态学操作,例如腐蚀和膨胀,也可以用于提取骨架。#### 2.1 腐蚀和膨胀腐蚀操作会缩减图像的边界,而膨胀操作会扩大图像的边界。通过交替使用腐蚀和膨胀,可以逐步提取图像的骨架。```python import cv2 import numpy as np# 加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 创建结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 腐蚀和膨胀 skeleton = thresh.copy() while True:eroded = cv2.erode(skeleton, kernel)dilated = cv2.dilate(eroded, kernel)skeleton = cv2.subtract(skeleton, dilated)if cv2.countNonZero(skeleton) == 0:break# 显示骨架结果 cv2.imshow('Skeleton', skeleton) cv2.waitKey(0) cv2.destroyAllWindows() ```#### 2.2 形态学开运算和闭运算形态学开运算先腐蚀再膨胀,可以去除图像中的小噪声,而闭运算先膨胀再腐蚀,可以填充图像中的小孔洞。通过使用这些操作,可以得到更清晰的骨架。```python import cv2 import numpy as np# 加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 创建结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 形态学开运算和闭运算 opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)# 显示骨架结果 cv2.imshow('Skeleton', closing) cv2.waitKey(0) cv2.destroyAllWindows() ```### 3. 总结本文介绍了 OpenCV 中常用的骨架提取方法,包括距离变换与细化算法以及形态学操作。不同的方法适用于不同的场景,需要根据具体情况选择最合适的算法。
注意:
以上代码示例只提供了基本的操作步骤,需要根据具体图像和应用场景进行调整。
OpenCV 骨架提取
简介骨架提取,也称为细化,是图像处理中一个重要的操作,它将图像简化为其中心线或骨架,保留了图像的形状信息,同时减少了数据量。这在许多应用中都很有用,比如字符识别、形状分析、医学图像处理等。OpenCV 提供了一系列用于骨架提取的函数,本文将详细介绍几种常用的方法。
1. 距离变换与细化算法
1.1 距离变换距离变换是骨架提取的第一步,它计算图像中每个像素点到最近的非零像素点的距离。OpenCV 提供了 `cv2.distanceTransform()` 函数实现这一功能。```python import cv2 import numpy as np
加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
计算距离变换 dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)
显示距离变换结果 cv2.imshow('Distance Transform', dist) cv2.waitKey(0) cv2.destroyAllWindows() ```
1.2 细化算法距离变换完成后,需要使用细化算法提取骨架。OpenCV 提供了 `cv2.thinning()` 函数实现这一功能。```python import cv2 import numpy as np
加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
计算距离变换 dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)
细化图像 skeleton = cv2.ximgproc.thinning(dist)
显示骨架结果 cv2.imshow('Skeleton', skeleton) cv2.waitKey(0) cv2.destroyAllWindows() ```
2. 形态学骨架提取OpenCV 提供了形态学操作,例如腐蚀和膨胀,也可以用于提取骨架。
2.1 腐蚀和膨胀腐蚀操作会缩减图像的边界,而膨胀操作会扩大图像的边界。通过交替使用腐蚀和膨胀,可以逐步提取图像的骨架。```python import cv2 import numpy as np
加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
创建结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
腐蚀和膨胀 skeleton = thresh.copy() while True:eroded = cv2.erode(skeleton, kernel)dilated = cv2.dilate(eroded, kernel)skeleton = cv2.subtract(skeleton, dilated)if cv2.countNonZero(skeleton) == 0:break
显示骨架结果 cv2.imshow('Skeleton', skeleton) cv2.waitKey(0) cv2.destroyAllWindows() ```
2.2 形态学开运算和闭运算形态学开运算先腐蚀再膨胀,可以去除图像中的小噪声,而闭运算先膨胀再腐蚀,可以填充图像中的小孔洞。通过使用这些操作,可以得到更清晰的骨架。```python import cv2 import numpy as np
加载图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
二值化图像 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
创建结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
形态学开运算和闭运算 opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
显示骨架结果 cv2.imshow('Skeleton', closing) cv2.waitKey(0) cv2.destroyAllWindows() ```
3. 总结本文介绍了 OpenCV 中常用的骨架提取方法,包括距离变换与细化算法以及形态学操作。不同的方法适用于不同的场景,需要根据具体情况选择最合适的算法。 **注意:** 以上代码示例只提供了基本的操作步骤,需要根据具体图像和应用场景进行调整。