Python图像处理之目标物体轮廓提取的实现方法
本文详解利用Python进行图像轮廓提取的方法。通过彩色转灰度、二值化处理,结合8邻域算法判断像素点是否位于物体内部或边缘,最终实现轮廓提取。文章提供完整Python代码示例及处理效果对比,适用于计算机视觉基础学习与算法实践。
1 引言
目标物体的边缘信息在图像识别与计算机视觉分析中具有重要价值。边缘能够清晰勾勒物体形态,便于直观观察;同时,边缘蕴含方向、形状等关键内在特征,是提取图像特征的核心要素。轮廓提取作为边界分割的关键环节,属于图像处理中的经典难题,其目标与轮廓跟踪一致,即获取图像的外部轮廓特征。
2 原理
二值图像轮廓提取的核心逻辑在于“掏空内部点”:若原图中某像素点为黑色,且其周围8个邻域像素均为黑色,则该点被判定为内部点并予以删除。对于非二值图像,需先执行二值化预处理。尽管轮廓提取算法众多,本文介绍一种基础且易于实现的算法,具体原理如下:
- 在轮廓提取过程中,使用一维数组记录待处理像素点的8邻域信息。
- 若8个邻域像素的灰度值与中心点灰度值一致,则判定该点位于物体内部,可执行删除操作;
- 否则,判定该点位于图像边缘,需予以保留。
- 遍历图像中所有像素点后,最终保留的点集即为图像轮廓。
3 Python实现
1)读入彩色图像
img_name = "./20210808/sample3.png"
img = cv2.imread(img_name)
处理结果如下:

2) 彩色图像灰度化
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
处理结果如下:

3)二值化
def get_binary_img(img):
# gray img to bin image
bin_img = np.zeros(shape=(img.shape), dtype=np.uint8)
h = img.shape[0]
w = img.shape[1]
for i in range(h):
for j in range(w):
bin_img[i][j] = 255 if img[i][j] > 127 else 0
return bin_img
# 调用
bin_img = get_binary_img(gray_img)
处理结果如下:

4)提取轮廓
基于上述原理进行代码实现,具体代码如下:
def get_contour(bin_img):
# get contour
contour_img = np.zeros(shape=(bin_img.shape),dtype=np.uint8)
contour_img += 255
h = bin_img.shape[0]
w = bin_img.shape[1]
for i in range(1,h-1):
for j in range(1,w-1):
if(bin_img[i][j]==0):
contour_img[i][j] = 0
sum = 0
sum += bin_img[i - 1][j + 1]
sum += bin_img[i][j + 1]
sum += bin_img[i + 1][j + 1]
sum += bin_img[i - 1][j]
sum += bin_img[i + 1][j]
sum += bin_img[i - 1][j - 1]
sum += bin_img[i][j - 1]
sum += bin_img[i + 1][j - 1]
if sum == 0:
contour_img[i][j] = 255
return contour_img
# 调用
contour_img = get_contour(bin_img)
处理结果如下:

4 总结
通过上述简单步骤,我们成功实现了物体轮廓提取,相应的处理效果如下:

上图中左侧为原始图像,右侧为提取出的物体轮廓图。
到此这篇关于Python图像处理之目标物体轮廓提取的文章就介绍到这了,更多相关Python目标物体轮廓提取内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









