1.图像的轮廓
1.1绘制几何图像的轮廓
操作用图:
操作代码示例:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(9).jpg") # 读取原图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 彩色图像转为变成单通道灰度图像
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 灰度图像转为二值图像
# 检测图像中出现的所有轮廓,记录轮廓的每一个点
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 绘制所有轮廓,宽度为5,颜色为红色
cv2.drawContours(img, contours, -1, (0, 0, 255), 5)
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
1.2绘制不规则的轮廓
操作用图像:
操作代码示例:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(10).jpg") # 读取原图
cv2.imshow("img", img) # 显示原图
img = cv2.medianBlur(img, 5) # 使用中值滤波去除噪点
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 原图从彩图变成单通道灰度图像
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 灰度图像转化为二值图像
cv2.imshow("binary", binary) # 显示二值化图像
# 获取二值化图像中的轮廓极轮廓层次数据
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2) # 在原图中绘制轮廓
cv2.imshow("contours", img) # 显示绘有轮廓的图像
cv2.waitKey()
cv2.destroyAllWindows()
效果图像:
2.轮廓拟合
2.1矩形包围框
操作用图像:
操作代码示例:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\6(1).png") # 读取原图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 将灰度图像进行二值化阈值处理
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取二值化图像中的轮廓极轮廓层次数据
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h = cv2.boundingRect(contours[0]) # 获取第一个轮廓的最小矩形边框,记录坐标和宽高
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 绘制红色矩形
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
2.2圆形包围框
操作代码示例:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\6(1).png") # 读取原图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 将灰度图像进行二值化阈值处理
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取二值化图像中的轮廓极轮廓层次数据
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
center, radius = cv2.minEnclosingCircle(contours[0]) # 获取最小圆形边框的圆心点和半径
x = int(round(center[0])) # 圆心点横坐标转为近似整数
y = int(round(center[1])) # 圆心点纵坐标转为近似整数
cv2.circle(img, (x, y), int(radius), (0, 0, 255), 2) # 绘制圆形
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
3.凸包
操作代码示例:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\6(1).png") # 读取原始图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图像
ret, binary = cv2.threshold(gray, 127, 225, cv2.THRESH_BINARY) # 二值化阈值处理
# 检测图像中出现的所有轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
hull = cv2.convexHull(contours[0]) # 获取轮廓的凸包
cv2.polylines(img, [hull], True, (0, 0, 255), 2) # 绘制凸包
cv2.imshow("img", img) # 显示图像
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
4.Canny边缘检测
操作用图像:
操作代码示例:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(5).jpg") # 读取原图
r1 = cv2.Canny(img, 10, 50); # 使用不同的阈值进行边缘检测
r2 = cv2.Canny(img, 100, 200);
r3 = cv2.Canny(img, 400, 600);
cv2.imshow("img", img) # 显示原图
cv2.imshow("r1", r1) # 显示边缘检测结果
cv2.imshow("r2", r2)
cv2.imshow("r3", r3)
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
5.霍夫变换
5.1 直线检测
操作用图像:
操作代码示例:
import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\pen.jpg") # 读取原图
o = img.copy() # 复制原图
o = cv2.medianBlur(o, 5) # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
binary = cv2.Canny(o, 50, 150) # 绘制边缘图像
# 检测直线,精度为1,全角度,阈值为15,线段最短100,最小间隔为18
lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 15, minLineLength=100, maxLineGap=18)
for line in lines: # 遍历所有直线
x1, y1, x2, y2 = line[0] # 读取直线两个端点的坐标
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) # 在原始图像上绘制直线
cv2.imshow("canny", binary) # 显示二值化边缘图案
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
5.2圆环检测
操作用图像:
操作代码示例:
import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\6(2).jpg") # 读取原图
o = img.copy() # 复制原图
o = cv2.medianBlur(o, 5) # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 检测圆环,圆心最小间距为70,Canny最大阈值为100,投票数超过25。最小半径为10,最大半径为50
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, minRadius=10, maxRadius=50)
circles = np.uint(np.around(circles)) # 将数组元素四舍五入成整数
for c in circles[0]: # 遍历圆环结果
x, y, r = c # 圆心横坐标、纵坐标和圆半径
cv2.circle(img, (x, y), r, (0, 0, 255), 3) # 绘制圆环
cv2.circle(img, (x, y), 2, (0, 0, 255), 3) # 绘制圆心
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey()
cv2.destroyAllWindows()
操作效果图像:
有关轮廓检测的内容就到这里了,感谢大家的观看!!!