当我们处理图像时,图像分割和提取是非常重要的操作,这可以使我们分离出我们需要的图像特征和信息。在Python中,我们可以使用OpenCV库来完成这些操作。 下面是一些关于如何使用OpenCV进行图像分割和提取的完整攻略:
安装OpenCV库
在开始之前,你需要先安装OpenCV库。你可以使用pip
命令来安装:
pip install opencv-python
读取图像
在进行图像分割和提取之前,首先需要读取一张图像。可以使用cv2.imread()
函数来读取图像。该函数接受一个参数,即图像的路径。下面是一个示例:
import cv2
img = cv2.imread('my_image.jpg')
分割图像
图像分割可以将图像分成多个部分,每个部分表示不同的特征,例如:图像的强度、色彩、形状等。在OpenCV中,有两种基本的图像分割方法:阈值分割和区域分割。
阈值分割
阈值分割是指将图像根据一个阈值,将图像中的像素点分成两部分:大于等于阈值的像素点和小于阈值的像素点。可以使用cv2.threshold()
函数来实现阈值分割。下面是一个示例:
import cv2
# 阈值
threshold_value = 128
# 读取图像
src = cv2.imread('my_image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
# 执行阈值分割
_, dst = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY)
# 显示结果
cv2.imshow('Threshold Image', dst)
cv2.waitKey(0)
该示例将阈值设为128。首先将图像转换为灰度图像,然后通过cv2.threshold()
函数执行阈值分割操作。函数的第一个参数是灰度图像,第二个参数是阈值,第三个参数是最大像素值。最后的参数定义了阈值分割的类型:cv2.THRESH_BINARY
表示二值化分割。在这个示例中,通过cv2.imshow()
来显示分割结果。
区域分割
区域分割将图像分成多个区域,每个区域表示不同的特征。OpenCV中提供了多种区域分割算法。其中比较常用的是分水岭算法。下面是一个示例:
import cv2
import numpy as np
# 读取图像
img = cv2.imread('my_image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 执行高斯滤波
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv2.dilate(opening,kernel,iterations=3)
# 执行距离变换
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
# 执行分水岭变换
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]
# 显示分割结果
cv2.imshow('Watershed Image', img)
cv2.waitKey(0)
该示例中将使用分水岭算法进行区域分割。首先将图像转换为灰度图像,并执行高斯滤波。然后通过cv2.threshold()
函数执行阈值分割。接着,执行距离变换,以便将前景与背景分离。最后,执行分水岭变换,来获取图像中所有的前景和背景,并通过cv2.imshow()
函数来显示分割结果。
物体提取
物体提取可以将图像中某一个特定的物体从背景中提取出来。在OpenCV中,我们可以使用多种方法来实现物体提取,包括模板匹配、轮廓提取等。下面是一些基本示例:
模板匹配
模板匹配是指在图像中查找与模板最相似的区域。可以使用cv2.matchTemplate()
函数来实现模板匹配。下面是一个示例:
import cv2
import numpy as np
# 读取图像
img = cv2.imread('my_image.jpg')
# 模板图像
template = cv2.imread('template.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 执行模板匹配
res = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)
# 获取匹配结果并绘制矩形框
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
# 显示结果
cv2.imshow('Template', img)
cv2.waitKey(0)
该示例使用cv2.matchTemplate()
函数实现模板匹配。函数的第一个参数是原始图像,第二个参数是模板图像,第三个参数是匹配方法。在这个示例中,使用的是cv2.TM_CCOEFF_NORMED
方法。接着,使用np.where()
函数来获取匹配结果,找出图像中与模板匹配的区域。最后,在匹配区域上绘制矩形框,并使用cv2.imshow()
函数来显示结果。
轮廓提取
轮廓提取是指从图像中获取物体的外形边缘。可以使用cv2.findContours()
函数来获取图像中的物体轮廓。下面是一个示例:
import cv2
# 读取图像
img = cv2.imread('my_image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 执行阈值分割
ret,thresh = cv2.threshold(gray,127,255,0)
# 获取轮廓
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(img, contours, -1, (0,255,0), 3)
# 显示结果
cv2.imshow('Contours', img)
cv2.waitKey(0)
该示例使用cv2.findContours()
函数来获取图像中的物体轮廓。函数的第一个参数是阈值分割后的图像,第二个参数是轮廓检索模式,第三个参数是轮廓逼近方法。在这个示例中,使用的是cv2.RETR_TREE
检索模式和cv2.CHAIN_APPROX_SIMPLE
逼近方法。最后,使用cv2.drawContours()
函数来绘制轮廓,并使用cv2.imshow()
函数来显示结果。
以上就是关于如何在Python中,使用OpenCV库进行图像分割和提取的完整攻略。希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中的opencv 图像分割与提取 - Python技术站