Python OpenCV实现图像分割与目标物提取实战
本文介绍如何使用Python和OpenCV库完成图像分割及目标物提取。通过读取图片、灰度化与二值化处理,利用cv2.findContours提取边界轮廓。随后结合cv2.pointPolygonTest判断像素点位置,在黑色底板上精准提取目标区域并保存结果,适用于Windows平台下的Spyder环境开发。
环境配置与目标概述
本教程的运行环境为Windows系统,使用Python3.x版本,开发工具选用Spyder IDE。主要目标是实现从单张背景图片中精确提取特定目标物,具体效果如图所示:

图片读取
图像读取与预处理
###############头文件
import matplotlib.pyplot as plt
import os
import cv2
import numpy as np
from PIL import Image
#from skimage import io
import random
from PIL import Image
首先需要完成图片的读取操作,并通过cv2.imshow函数进行显示验证。
img = cv2.imread("1_3img.png")############图片读取
#cv2.imshow('picture', img)
#cv2.waitKey(0)
pictue_size=img.shape
picture_height=pictue_size[0]
picture_width=pictue_size[1]
边界提取
二值化与边界提取
################灰度化,以及二值化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,1,255,cv2.THRESH_BINARY)
############################
######################边界提取,contours包含边界值的坐标
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
边界提取主要采用cv2.findContours函数。在执行边缘提取前,需将图像转换为二值图像。需要注意的是,不同版本的Open库中cv2.findContours函数的返回值数量存在差异,可能返回两个或三个值,本文所用版本仅返回两个值。变量contours存储了所有边界点的集合,类型为list。由于图中包含三个独立区域,因此len(contours)的结果为3,每个列表元素内均包含对应的边界数据。
图片提取
基于轮廓的目标物提取
img2=[0 for i in range(len(contours))]
print(len(contours))
for i in range(len(contours)):
img2[i]=cv2.imread("./blackboard/test.jpg")############黑色底板图片读取
print(img2[i].shape)
# cv2.drawContours(img2[i],contours[i],-1,(0,0,255),3) #########画边界
###############全图片遍历找到相应的在轮廓之内的点
for a in range(picture_height):
for b in range(picture_width):
#############################################辨别是否在轮廓内是定义为1,不是定义为-1
result = cv2.pointPolygonTest(contours[i], (a,b), False)
if result>0:
img2[i][b,a]=100
##############下面填写保存代码
scipy.misc.imsave('picture'+str(i)+'.jpg',img2[i])
首先读取一张全黑色的底版图片,其所有像素值初始为0。接着利用cv2.pointPolygonTest函数分析各个像素点是否位于边界区域内:若点在边界内则返回1,否则返回-1。对于判定在区域内的点,将其像素值赋为100并保存,最终即可得到提取后的目标图片。
至此,关于使用Python和OpenCV完成图像分割并提取目标物的教程介绍完毕。如需了解更多相关Python OpenCV图像分割与提取内容,建议搜索本站往期文章或继续浏览后续相关文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













