数字图像处理4
预处理——ROI——形态学处理
形态学处理
形态学变化只能在二值图上处理
1.腐蚀Erode
对kernel映射的区域做与操作,包括自己在内如果有0则中间赋值成0
2.膨胀Dilate
对kernel映射的区域做或操作,包括自己在内如果有1则中间赋值成1
3.其他操作
开操作:先腐蚀后膨胀(消除小区域并分离物体而不影响原来图像)
闭操作:先膨胀后腐蚀(填充物体内部的小孔,除去小黑点而不影响原来图像)
形态学梯度运算:膨胀和腐蚀的图像相减
顶帽:原图像-开操作后图像(获取噪声或者边缘信息)
顶帽:原图像-闭操作后图像
轮廓操作
Canny轮廓提取
im_for_read=R"D:\AAAproject\PYproject\EXPERuse\zaosheng.jpg"
img=cv2.imread(im_for_read,-1)
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_image, threshold1=150, threshold2=200)
cv2.imshow("edges", edges)
cv2.waitKey(0)
cv2.findContours()
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
提取出来的轮廓需要被数字化的,所以要查找轮廓在哪些地方,
第一个参数是已经被提取轮廓后的图像
第二个参数是提取模式
cv2.RETR_EXTERNAL
: 只检索最外层的轮廓
cv2.RETR_TREE
: 检索所有轮廓,并重构轮廓之间的完整层次结构
cv2.RETR_LIST
: 检索所有轮廓但不分层次结构。
第三个参数是轮廓近似方法
cv2.CHAIN_APPROX_SIMPLE
: 压缩水平、垂直和对角方向的元素,只保留端点。例如,一个直立的矩形轮廓只需存储四个点。
cv2.CHAIN_APPROX_NONE
: 存储所有的轮廓点。
cv2.drawContours()
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
那么在提取完轮廓之后需要进行加强,
第一个参数是要被画轮廓的图像
第二个参数是cv2.findContours()找到的轮廓
第三个参数是要绘制的轮廓的索引,-1则全绘制
第四个参数是绘制轮廓的颜色,用brg表示
第五个参数是轮值轮廓线的厚度(-1是填充)
计算轮廓的周长和面积
# 假设 contours 是 cv2.findContours() 找到的轮廓列表
for cnt in contours:# 计算每个轮廓的周长 (假设是闭合的)perimeter = cv2.arcLength(cnt, True)print(f"轮廓周长: {perimeter}")
第一个参数是counters[i]
第二个参数是轮廓是否闭合
# 假设 contours 是 cv2.findContours() 找到的轮廓列表
for cnt in contours:# 计算每个轮廓的面积area = cv2.contourArea(cnt)print(f"轮廓面积: {area}")
面积第二个参数可选是否返回带符号的面积值
外接形拟合
外接矩形
x, y, w, h = cv2.boundingRect(contour)
可用来判断图形的大致形状
还有最小外接矩形
rotated_rect = cv2.minAreaRect(contour)
返回值是一个center坐标,width,higth,angle
外接圆形
(center, radius) = cv2.minEnclosingCircle(contour)
可以用来求中心坐标
其他轮廓形状
凸包,多边形
绘图操作
画线 画圆 画多边形(可直接放入最适多边形输出)
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img
: 要在其上绘图的图像。
pt1
: 线条起点的坐标 (x, y)。pt2
: 线条终点的坐标 (x, y)。color
: 线条的颜色(对于RGB图像,使用BGR格式,如(255, 0, 0)
表示蓝色)。thickness
: 可选参数,线条的粗细(默认为1)
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
画文本
img
: 要在其上绘图的图像。center
: 圆心位置的坐标 (x, y)。radius
: 圆的半径。color
: 圆的颜色(对于RGB图像,使用BGR格式,如(0, 255, 0)
表示绿色)。thickness
: 可选参数,线条的粗细。若为负值(如cv2.FILLED
),则填充整个形状。
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
img
: 要在其上添加文本的图像。text
: 要显示的字符串。org
: 文本左下角的坐标 (x, y)。fontFace
: 字体类型(如cv2.FONT_HERSHEY_SIMPLEX
,cv2.FONT_HERSHEY_COMPLEX
等)。fontScale
: 字体大小比例因子。如果值大于1,则字体放大;小于1则缩小。color
: 文本的颜色(对于RGB图像,使用BGR格式,如(255, 0, 0)
表示蓝色)。thickness
: 可选参数,线条的粗细(默认为1)。lineType
: 可选参数,与画线时相同,可选择cv2.LINE_4
,cv2.LINE_8
,cv2.LINE_AA
(抗锯齿线条)。bottomLeftOrigin
: 可选参数,当值为True时,文本的原点是在左下角,否则(默认)在左上角。