一、实践效果
将图片test.jpg放在桌面,编写代码 cv_lesson2.py
import cv2
import numpy as np
#读取图片
img = cv2.imread("test.jpg")
# 功能1: 彩色图-》灰度图(黑白)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
#功能2: 高斯模糊(磨皮/去噪)
blur = cv2.GaussionBlur(gray,(9,9),0)
cv2.imshow("blur",blur)
#功能3:canny边缘检测(找轮廓)
canny = cv2.Canny(blur,50,150) #边缘检测
cv2.imshow("canny",canny)
#等待案件,关闭所有窗口
cv2.waitkay(0)
cv2.destroyAllWindows()
1. 灰度图
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- 彩色图有 3 个颜色通道,灰度图只有 1 个通道,计算更快
- 几乎所有 CV 识别任务,第一步都是转灰度图
2. 高斯模糊
cv2.GaussianBlur(gray, (9,9), 0)
(9,9):模糊核大小,数字越大模糊越强(必须是奇数:3,5,7,9...)- 作用:去掉图片杂点,让边缘检测更精准
3. Canny 边缘检测
cv2.Canny(blur, 50, 150)
- CV 最经典的边缘检测算法
- 能找出图片里所有物体的轮廓线
- 后面做人脸、车牌、物体检测全靠它
- 把
(9,9)改成(3,3)→ 模糊变弱 - 把
(9,9)改成(15,15)→ 非常模糊 - 把
50,150改成100,200→ 边缘变少
二、原理讲解
1. 灰度化原理
把RGB三种颜色,加权平均成一个亮度值,变成黑白
- 彩色图 = 3 层数据:R (红)、G (绿)、B (蓝)
- 灰度图 = 1 层数据:亮度
- 公式(OpenCV 内部自动算):
灰度值 = 0.299×R + 0.587×G + 0.114×B
为什么要这么算?
人眼对绿色最敏感,对蓝色最不敏感,所以加权后更接近人眼看到的黑白效果。
作用:
减少计算量、去掉颜色干扰、让后续算法更快更准。
2. 模糊化(高斯模糊)原理
让每个像素,都和周围像素 "平均一下",画面就变柔变模糊。
通俗比喻:
就像你给照片抹了一层雾。
详细原理:
- 用一个小窗口(比如 3×3、9×9)在图片上滑动
- 窗口中心的像素 = 窗口内所有像素的加权平均值
- 高斯模糊 = 按正态分布加权,中间权重高,周围权重低
作用:
去噪点、让图像更平滑、防止边缘检测抓到杂线。
- 边缘检测(Canny)原理
找到像素值 "突然变化" 的地方,那就是边缘!
通俗比喻:
想象你在走路:
- 平地走 = 像素变化小 = 不是边缘
- 突然下台阶 = 像素变化大 = 边缘!
详细原理(OpenCV 内部 4 步):
- 先高斯模糊去噪
- 计算每个点的像素梯度(变化大小)
- 保留变化最大的点
- 双阈值筛选,留下真正的边缘
作用:
提取物体轮廓,是人脸识别、物体检测的基础!
总结:
- 灰度化:去掉颜色,只留亮度
- 模糊化:像素周围平均,去噪柔化
- 边缘检测:找像素突变的地方,画轮廓线