最近身边越来越多人问我:“我想学一点计算机视觉,但不知道从哪开始……要学深度学习吗?要懂模型吗?”
其实不用那么复杂。
如果你能运行 Python,那你就已经有了入门视觉处理的一切基础。今天我就带你用最简单的方式体验一次完整的图像处理流程,让电脑真正“看懂”一张图片。
这一篇文章适合任何人,不管你是学生、工程师、还是纯粹好奇,只要你想入门视觉,读完后你就能写出自己的第一段视觉代码。

如果你完全没有经验,Python + OpenCV 是最轻松的选择,因为它有三个优势:
一行命令就能完成安装:
pip install opencv-python
OpenCV 是视觉领域最经典的库,几乎你想到的功能它都有。
比如彩色转灰度你只需要一行:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
你只需要做两件事:
安装 Python(你大概率已经有)
安装 OpenCV:
pip install opencv-python
3.验证安装是否成功:
import cv2
print(cv2.__version__)

所有视觉处理的基础,就是把图像读进来。
新建一个 Python 文件,写入下面的代码:
import cv2
img = cv2.imread("test.jpg")
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
当你能看到图片弹出来时,请恭喜自己:
你已经完成第一个视觉任务:读取与显示图像。
这是我的测试图片,可自取,随便一张都行
这样屏幕会有一个框显示出来
很多分析不需要颜色,只需要光强信息。灰度化就是把彩色转成黑白。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray", gray)
为什么要灰度化?
减少计算量
更容易提取轮廓和边缘
很多检测算法只接受灰度输入
下面那个就是灰度图
在进行边缘检测前,通常需要减少噪声,否则图片会复杂得让算法难以判断。
blur = cv2.GaussianBlur(gray, (5,5), 0)
cv2.imshow("Blur", blur)


其实细看还是有点区别的,第一个是原图,第二个是高斯模糊后的
别看代码短,高斯模糊的重要性非常高,它能帮助算法过滤掉无关噪点,让“真正的边缘”更容易被找到。
这是视觉世界里最经典的操作之一,只需要两行代码:
edges = cv2.Canny(blur, 100, 200)
cv2.imshow("Edges", edges)
你会看到一幅干净利落的黑白边缘图,被提取出来的那些线条,就是图像的重要结构信息。
这是我的
然后一个综合代码出现了,经历了图像读取,灰度转换,高斯模糊,边缘检测的程序新鲜出炉
import cv2
img = cv2.imread("test.jpg")
# cv2.imshow("Image", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow("Gray", gray)
blur = cv2.GaussianBlur(gray, (5,5), 0)
# 参数是:
# gray: 输入图像
# (5,5): 高斯核大小,必须是奇数
# 0: 高斯标准差,0表示自动计算
# cv2.imshow("Blur", blur)
edges = cv2.Canny(blur, 100, 200)
# 参数是:
# blur: 输入图像
# 100: 低阈值,低于此值的像素将被认为是边缘
# 200: 高阈值,高于此值的像素将被认为是强边缘
cv2.imshow("Edges", edges)
# cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我记得第一次知道人脸识别是很小的时候,在一个科幻电影里面,一个超级金库需要人脸识别,感觉超级酷,那现在我们只需要很短的时间就可以复刻一个人脸检测,不过还开不了金库门!
我简单搜索了一张人脸图片
OpenCV 提供现成模型,你不用训练任何东西,只要直接用:
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
检测并框出人脸:
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2)
但是实际写起来就需要加一些东西
源码放这里
import cv2
import numpy as np
# 获取OpenCV分类器的正确路径
cascade_path = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
# 加载分类器,haarcascade_frontalface_default.xml是OpenCV提供的默认人脸检测器,cv2.data.haarcascades是OpenCV的默认数据路径,+"haarcascade_frontalface_default.xml"是完整的路径
face_cascade = cv2.CascadeClassifier(cascade_path)
# cv2.CascadeClassifier()函数的参数是分类器的路径,返回一个分类器对象
# 检查分类器是否成功加载
if face_cascade.empty():
"""
如果分类器为空,说明加载失败,退出程序
"""
print("错误:无法加载人脸检测分类器")
print(f"分类器路径:{cascade_path}")
exit()
# 确保测试图像存在,否则创建一个示例图像
img_path = "face_test.jpg" # 被检测的文件的路径
if not cv2.os.path.exists(img_path):
"""
如果测试图像不存在,说明加载失败,退出程序
"""
exit()
img = cv2.imread(img_path)
# 检查图像是否成功加载
if img is None:
print(f"错误:无法读取图像 {img_path}")
exit()
# cv2.imshow("Image", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow("Gray", gray)
blur = cv2.GaussianBlur(gray, (5,5), 0)
# 参数是:
# gray: 输入图像
# (5,5): 高斯核大小,必须是奇数
# 0: 高斯标准差,0表示自动计算
# cv2.imshow("Blur", blur)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# 参数是:
# gray: 输入图像
# 1.1: 缩放因子,每次检测时,图像会按此因子缩放
# 4: 每个目标至少检测到4次才会被认为是一个有效目标
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2)
# 参数是:
# img: 输入图像
# (x,y): 矩形框的左上角坐标
# (x+w, y+h): 矩形框的右下角坐标
# (0,255,0): 矩形框的颜色,这里是绿色
# 2: 矩形框的线宽
cv2.imshow("Faces", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这就是你的第一个小“视觉应用原型”。
感谢模特做出的贡献