OpenCV+TensorFlow 入门人工智能图像处理---xingkeit.top/7704/
学习图像处理不应是一上来就背诵晦涩的公式,而应该遵循“数据读取 -> 预处理增强 -> 模型识别”的逻辑闭环。
第一阶段:计算机的“眼睛”——OpenCV 基础
TensorFlow 虽然强大,但在处理底层像素操作(如裁剪、旋转、灰度化)时,不如 OpenCV 灵活。学习的第一步,是教会计算机如何“看”图片。
1. 读取与展示
这是所有视觉项目的起点。你需要理解图像在计算机眼中就是一个三维数组(高、宽、通道)。
python
复制
import cv2
import numpy as np
# 读取图片
# cv2.imread 读取格式为 BGR(蓝绿红),不同于常规的 RGB
img = cv2.imread('lena.jpg')
if img is None:
print("图片路径错误,请检查!")
else:
# 获取图片尺寸
height, width, channels = img.shape
print(f"图片高度: {height}, 宽度: {width}, 通道数: {channels}")
# 显示图片
cv2.imshow('Original Image', img)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows()
2. 核心预处理:灰度化与二值化
模型训练前,通常需要去除色彩干扰,这叫“降噪”。
python
复制
# 将 BGR 图片转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理:将像素点强行变为 0(黑)或 255(白)
# 阈值设为 127
ret, binary_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Binary', binary_img)
cv2.waitKey(0)
3. 图像增强:数据扩充
在教育视角中,这一步至关重要。为了让模型更健壮,我们需要通过代码制造更多的“变种数据”。
python
复制
# 翻转图片(水平翻转)
flip_img = cv2.flip(img, 1)
# 旋转图片
# 旋转中心,角度,缩放比例
M = cv2.getRotationMatrix2D((width/2, height/2), 45, 0.7)
rotated_img = cv2.warpAffine(img, M, (width, height))
cv2.imshow('Flipped', flip_img)
cv2.imshow('Rotated', rotated_img)
cv2.waitKey(0)
第二阶段:计算机的“大脑”——TensorFlow 建模
当图片通过 OpenCV 处理成标准格式后,就轮到 TensorFlow 上场了。这里我们演示最经典的 CNN(卷积神经网络)来识别手写数字。
1. 数据准备与归一化
神经网络对数值非常敏感,必须将 [0, 255] 的像素值压缩到 [0, 1] 区间。
python
复制
import tensorflow as tf
from tensorflow.keras import layers, models
# 加载 MNIST 数据集(手写数字数据集)
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# 归一化处理:将像素值从 0-255 映射到 0-1
train_images, test_images = train_images / 255.0, test_images / 255.0
# 调整数据形状以适应 CNN (样本数, 高, 宽, 通道数)
# MNIST 是灰度图,通道数为 1
train_images = train_images.reshape((-1, 28, 28, 1))
test_images = test_images.reshape((-1, 28, 28, 1))
2. 搭建卷积神经网络 (CNN)
理解这里的 Conv2D(卷积层,提取特征)和 MaxPooling2D(池化层,压缩数据)是关键。
python
复制
model = models.Sequential([
# 第一层卷积:提取边缘、线条等基础特征
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
# 第二层卷积:提取形状、组合特征
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
# 第三层卷积:提取抽象语义
layers.Conv2D(64, (3, 3), activation='relu'),
# 展平层:将三维特征图转化为一维向量
layers.Flatten(),
# 全连接层:进行分类决策
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax') # 输出10个类别的概率
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 打印模型结构,理解数据流向
model.summary()
3. 模型训练与评估
python
复制
print("开始训练模型...")
# epochs=5 表示把整个数据集过 5 遍
model.fit(train_images, train_labels, epochs=5, batch_size=64)
print("\n评估模型性能...")
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\n测试集准确率: {test_acc*100:.2f}%')
第三阶段:学以致用——将两者结合
在实际的工程开发中,我们往往是用 OpenCV 读取摄像头画面,预处理后喂给 TensorFlow 模型。这就是典型的 AIoT 应用雏形。
python
复制
import cv2
import numpy as np
# 加载上面训练好的模型 (假设已保存为 'mnist_model.h5')
# model = tf.keras.models.load_model('mnist_model.h5')
# 模拟从摄像头获取一帧画面,或者读取一张手写数字图片
frame = cv2.imread('my_handwriting.jpg')
# 1. OpenCV 预处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 调整大小以匹配模型输入 (28x28)
resized = cv2.resize(gray, (28, 28))
# 归一化
input_data = resized / 255.0
# 增加维度并转置通道
input_data = input_data.reshape(1, 28, 28, 1)
# 2. TensorFlow 预测
# prediction = model.predict(input_data)
# predicted_num = np.argmax(prediction)
# print(f"识别结果为: {predicted_num}")
总结
从教育视角来看,OpenCV 是“画笔”和“眼睛”,负责修饰和观察;TensorFlow 是“大脑”,负责思考和判断。
初学者应当先掌握 OpenCV 的数组操作,理解图像的本质;再深入 TensorFlow 的层结构,理解特征提取的逻辑。将两者融会贯通,你就正式推开了计算机视觉的大门。