Anaconda配置,YOLOv8安装与Canny边缘检测,图像金字塔,图像轮廓实战练习
激活YOLOv8环境conda activate yolov8_cpu安装YOLOv8库pip install ultralytics验证安装yolo predict model=yolov8n.pt source="https://ultralytics.com/images/bus.jpg"
一.Anaconda配置安装与虚拟环境创建
1.成功完成Anaconda配置安装
2.使用conda命令创建独立虚拟环境(YOLOv8模型安装)
激活YOLOv8环境 conda activate yolov8_cpu
![]()
安装YOLOv8库 pip install ultralytics
验证安装 yolo predict model=yolov8n.pt source="https://ultralytics.com/images/bus.jpg"
二.PyTorch安装
1.安装
pip install torch torchvision torchaudio
2.Python环境验证
import torch
print(torch.__version__)
print(torch.cuda.is_available())
输出 False 属于正常情况,表明当前为CPU运行环境。
三.Canny边缘检测
(1)使用高斯滤波器,以平滑图像,滤除噪声。
(2)计算图像中每个像素点的梯度强度和方向。
(3)应用非极大值( Non - Maximum Suppression )抑制,以消除边缘检测带来的杂散响应。(4)应用双阈值( Double - Threshold )检测来确定真实的和潜在的边缘。
(5)通过抑制孤立的弱边缘最终完成边缘检测。
1.高斯滤波器

2.梯度和方向

Sx从右到左,Sy从下到上
3.非极大值抑制
(1)
w:权重参数 w=(g1,dtmp1)/(g1,g2)
c>dtmp1且c>dtmp2,c保留,反之,c被抑制
(2)
A分别与B,C比较,A>B,且A>C,A保留,得出A的边界
4.双阈值检测

实战:
import cv2
import numpy as np
def cv_show(img, name):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img=cv2.imread(r'C:\test.jpg', cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)
res=np.hstack((v1,v2))
cv_show(res,'res')
img=cv2.imread(r'C:\test.jpg', cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,120,250)
v2=cv2.Canny(img,50,100)
res=np.hstack((v1,v2))
cv_show(res,'res')
80:minVal 150:maxVal
四.图像金字塔
图像提取:层层提取 总结到一起
1.高斯金字塔:向下采样法(缩小)
越采样越少(从大往小走)

Gi与高斯内核卷积:对应位置相乘,再加到一起,再除以总数
2.高斯金字塔:向上采样法(放大)
越采样越多(从小往大走)

实战:
img=cv2.imread(r'C:\test.jpg')
cv_show(img,'img')
print(img.shape)
up=cv2.pyrUp(img)
cv_show(up,'up')
print(up.shape)
down=cv2.pyrDown(img)
cv_show(down,'down')
print(down.shape)
up2=cv2.pyrUp(up)
cv_show(up2,'up2')
print(up2.shape)
up=cv2.pyrUp(img)
up_down=cv2.pyrDown(up)
cv_show(up_down,'up_down')
up=cv2.pyrUp(img)
up_down=cv2.pyrDown(up)
cv_show(img-up_down,'img-up_down')
3.拉普拉斯金字塔

Li=img(输入)—先执行down再执行up

G1:down E1:up
实战:
down=cv2.pyrDown(img)
down_up=cv2.pyrUp(down)
I_I=img-down_up
cv_show(I_I,'I_I')
五.图像轮廓

模式(mode)建议使用RETR_TREE
为了提高准确率,使用二值图像
先输入一张图像(img),再转换为灰度图,再对图像数据进行二值处理,得出结果
img=cv2.imread(r'C:\test.jpg')
gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh =cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
1.绘制轮廓
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
#注意需要copy,否则原图会变
import cv2
# 假设 img 是已加载的图像
draw_img = img.copy()
# 1. 预处理:转为灰度图 + 二值化(轮廓检测的必要步骤)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 2. 检测轮廓,生成 contours 变量
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 3. 绘制轮廓(注意:建议在副本 draw_img 上绘制,避免修改原图)
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
# 显示结果(假设 cv_show 是你封装的显示函数)
cv_show(res, 'res')
(3)contours 轮廓是什么, -1 把所有轮廓都画进去(数字是几画进去几个轮廓,按顺序进行选择), (0,0,255)B G R用R画轮廓,2 线条宽度
2.轮廓特征
注:辅助函数计算特征时需要把各个轮廓都拿出来才能使用
计算周长时标注Ture(表示闭合)/False
3.轮廓近似
曲线AB(AB连成一条直线),取曲线上一点C,使得C与直线AB距离最大(距离设为d)
若d<T(阈值),可以近似,曲线AB可以近似为直线AB

曲线AB(AB连成一条直线),取曲线上一点C,使得C与直线AB距离最大(距离设为d1),且连接AC,BC,曲线上一点距AC为d2
若d1>T(阈值),且d2<T,曲线AC可近似为直线AC(若不满足,继续画线,直到满足为止)
实战:
import cv2
# 1. 读取图像
img = cv2.imread(r'C:\test.jpg')
# 2. 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 3. 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 4. 检测轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
if not contours:
raise ValueError("未检测到任何轮廓")
cnt = contours[0]
# 5. 复制图像并绘制轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)
# 6. 显示结果
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
epsilon=0.1*cv2.arcLength(cnt,True )
approx=cv2.approxPolyDP(cnt,epsilon,True)
draw_img =img.copy ()
res=cv2.drawContours(draw_img,[approx],-1,(0,0,255),2)
cv_show(res,'res')
4.边界矩形
实战:
img =cv2.imread(r'C:\test.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh =cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy =cv2.findContours (thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt=contours[0]
x,y,w,h=cv2.boundingRect (cnt)
img =cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show(img,'img')
area =cv2.contourArea(cnt)
x,y,w,h =cv2.boundingRect( cnt )
rect_area = w * h
extent = float(area)/rect_area
print('轮廓面积与边界矩形比', extent)
5.外接圆
实战:
(x,y),radius=cv2.minEnclosingCircle(cnt)
center=(int(x),int(y))
radius=int(radius)
img=cv2.circle(img,center,radius,(0,255,0),2)
cv_show(img,'img')
更多推荐

所有评论(0)