一.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')

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐