cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
element = cv2.getStructuringElement(shape, ksize[, anchor])
用于创建形态学操作的结构元素(structuring element)。
参数解释:
shape:结构元素的形状,可以是以下值之一:
cv2.MORPH_RECT:矩形结构元素。
cv2.MORPH_CROSS:十字形结构元素。
cv2.MORPH_ELLIPSE:椭圆形结构元素。
ksize:结构元素的尺寸,表示结构元素的宽度和高度。可以是一个整数,表示正方形结构元素的边长;或者是一个元组 (width, height),表示矩形结构元素的宽度和高度。
anchor:可选参数,表示结构元素的锚点位置,默认为 (-1, -1),表示将锚点设置在结构元素的中心位置。
返回值:
element:创建的结构元素,可以用于形态学操作(如膨胀、腐蚀、开运算、闭运算等)。
cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)#进行闭运算,sd。首先进行膨胀后进行腐蚀操作,去除白色中的黑色点。
dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
形态学操作函数之一,用于对图像进行形态学运算。
参数解释:
src:输入图像,可以是单通道(灰度图)或多通道(彩色图)。
op:形态学操作类型,可以是以下值之一:
cv2.MORPH_ERODE:腐蚀操作。
cv2.MORPH_DILATE:膨胀操作。
cv2.MORPH_OPEN:开运算(先腐蚀后膨胀)。
cv2.MORPH_CLOSE:闭运算(先膨胀后腐蚀)。
cv2.MORPH_GRADIENT:形态学梯度(膨胀图像与腐蚀图像的差异)。
cv2.MORPH_TOPHAT:顶帽运算(原始图像与开运算结果的差异)。
cv2.MORPH_BLACKHAT:黑帽运算(闭运算结果与原始图像的差异)。
kernel:结构元素(kernel)用于指定形态学操作的范围和形状。
dst:可选参数,输出图像,与输入图像具有相同的大小和通道数。
anchor:可选参数,锚点位置,默认为 (-1, -1),表示将锚点设置在结构元素的中心位置。
iterations:可选参数,指定形态学操作的迭代次数,默认为 1。
borderType:可选参数,边界扩充类型,默认为 cv2.BORDER_CONSTANT。
borderValue:可选参数,边界填充值,默认为 0。
返回值:
dst:形态学操作的结果图像。
cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY)#可以理解为简单滤波
ret, thresh = cv2.threshold(src, thresh, maxval, type[, dst])
用于将图像进行二值化处理。
参数解释:
src:输入的图像,通常为灰度图像(单通道图像)。
thresh:阈值,用于将图像的像素值与该阈值进行比较。
maxval:当像素值大于阈值时,设置的像素值。
type:二值化类型,指定了如何将像素值与阈值进行比较和赋值。常用的类型有:
cv2.THRESH_BINARY:大于阈值的像素值设置为 maxval,小于等于阈值的像素值设置为 0。
cv2.THRESH_BINARY_INV:大于阈值的像素值设置为 0,小于等于阈值的像素值设置为 maxval。
cv2.THRESH_TRUNC:大于阈值的像素值设置为阈值,小于等于阈值的像素值保持不变。
cv2.THRESH_TOZERO:大于阈值的像素值保持不变,小于等于阈值的像素值设置为 0。
cv2.THRESH_TOZERO_INV:大于阈值的像素值设置为 0,小于等于阈值的像素值保持不变。
dst:可选参数,输出的二值化图像,与输入图像 src 的大小和类型相同。
返回值:
ret:计算得到的阈值。
thresh:二值化后的图像。
例子代码
import cv2
# 读取灰度图像
image = cv2.imread('image.jpg', 0)
# 进行二值化处理
ret, thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 显示原图和二值化图像
cv2.imshow('Original Image', image)
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中
contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
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_NONE:存储所有的轮廓点。
cv2.CHAIN_APPROX_SIMPLE:仅存储轮廓的端点。
cv2.CHAIN_APPROX_TC89_L1:使用 Teh-Chin 链逼近算法。
cv2.CHAIN_APPROX_TC89_KCOS:使用 Teh-Chin 链逼近算法。
contours:可选参数,检测到的轮廓列表。
hierarchy:可选参数,轮廓层次结构。
返回值:
contours:检测到的轮廓列表。
hierarchy:轮廓的层次结构,每个轮廓对应四个整数 [Next, Previous, First_Child, Parent]。
这个是contours返回的值的内容。
for c in contours:
x, y, w, h = cv2.boundingRect(c)#这个函数就是用来返回值使用的。
x, y, w, h = cv2.boundingRect(contour)
函数用于计算轮廓的边界矩形,即给出包围轮廓的最小矩形框。
参数解释:
contour:输入的轮廓。
返回值:
x:边界矩形左上角点的 x 坐标。
y:边界矩形左上角点的 y 坐标。
w:边界矩形的宽度。
h:边界矩形的高度。
使用 cv2.boundingRect() 函数可以获取轮廓的边界矩形信息,包括左上角点的坐标 (x, y) 以及矩形的宽度 w 和高度 h。这些信息可以用于进一步分析和处理轮廓,例如在图像中绘制边界矩形或提取矩形区域内的图像内容。在这里能够找到车牌的信息。
rect = cv2.minAreaRect(c)
retval, box = cv2.minAreaRect(points)
用于计算给定点集的最小外接矩形。最小外接矩形是能够完全包围点集并且具有最小面积的矩形。
参数解释:
points:要计算最小外接矩形的输入点集,可以是一个 Numpy 数组或者一个包含点的 Python 列表。
retval:返回值,表示最小外接矩形的相关信息。通常不会使用到该返回值。
box:最小外接矩形的信息,返回一个 ((center_x, center_y), (width, height), angle) 的元组,其中:
(center_x, center_y):最小外接矩形的中心点坐标。
(width, height):最小外接矩形的宽度和高度。
angle:最小外接矩形相对于水平方向的旋转角度。
例子
import cv2
import numpy as np
# 定义一个点集
points = np.array([[100, 50], [200, 100], [150, 200], [50, 150]], dtype=np.int32)
# 计算最小外接矩形
retval, box = cv2.minAreaRect(points)
# 提取最小外接矩形的信息
center, size, angle = box
width, height = size
# 在图像上绘制最小外接矩形
rect_points = cv2.boxPoints(box).astype(np.int32)
cv2.drawContours(image, [rect_points], 0, (0, 255, 0), 2)
# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
area = cv2.contourArea(contour)
用于计算给定轮廓的面积。轮廓是由一系列连续的点组成的闭合曲线。
参数解释:
contour:要计算面积的轮廓,可以是一个包含点的 Numpy 数组。
返回值:
area:轮廓的面积,以像素为单位。
代码
import cv2
import numpy as np
# 读取图像并进行灰度化和二值化处理
image = cv2.imread("image.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓的面积
for contour in contours:
area = cv2.contourArea(contour)
print("Contour Area:", area)
# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
points = cv2.boxPoints(box)
参数解释:
box:输入的旋转矩形,可以通过 cv2.minAreaRect() 函数计算得到。
返回值:
points:旋转矩形的四个角点坐标,返回的是一个包含四个坐标点的 Numpy 数组。
示例用法:
import cv2
# 创建一个旋转矩形
center = (100, 100)
size = (200, 100)
angle = 30
rect = (center, size, angle)
# 计算旋转矩形的四个角点坐标
points = cv2.boxPoints(rect)
print("Points:", points)
# 将浮点型坐标点转换为整数型
points = np.int0(points)
# 绘制旋转矩形
image = np.zeros((200, 200), dtype=np.uint8)
cv2.drawContours(image, [points], 0, 255, 2)
# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.boxPoints() 函数的输入参数是一个旋转矩形,该旋转矩形可以通过 cv2.minAreaRect() 函数计算得到。cv2.boxPoints() 函数返回的角点坐标是按照顺时针方向排列的。
cv2.drawContours() 和 cv2.rectangle() 是 OpenCV 中用于绘制轮廓和矩形的函数,它们之间有以下区别:
绘制对象:
cv2.drawContours(image, contours, contourIdx, color, thickness) 用于绘制轮廓,其中 image 是要在其上绘制轮廓的图像,contours 是轮廓的列表或数组,contourIdx 是要绘制的轮廓索引(-1 表示绘制所有轮廓),color 是轮廓的颜色,thickness 是轮廓的线宽度。
cv2.rectangle(image, pt1, pt2, color, thickness) 用于绘制矩形,其中 image 是要在其上绘制矩形的图像,pt1 是矩形的左上角坐标,pt2 是矩形的右下角坐标,color 是矩形的颜色,thickness 是矩形的边框线宽度。
使用场景:
cv2.drawContours() 适用于绘制复杂的轮廓,可以绘制闭合的和非闭合的轮廓,可以选择绘制单个轮廓或多个轮廓,常用于轮廓检测和分析。
cv2.rectangle() 适用于绘制简单的矩形,绘制的矩形是一个闭合的四边形,常用于标记和定位目标区域。
总结:cv2.drawContours() 用于绘制轮廓,而 cv2.rectangle() 用于绘制矩形。它们的主要区别在于绘制的对象不同,cv2.drawContours() 可以绘制任意形状的轮廓,而 cv2.rectangle() 绘制的是矩形。