文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 图像识别的十个经典算法

2024-11-28 15:04

关注

1. 直方图均衡化(Histogram Equalization)

直方图均衡化是一种常用的图像增强技术,可以改善图像的对比度。

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 应用直方图均衡化
equalized_image = cv2.equalizeHist(image)

# 显示原图和处理后的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Equalized Image')
plt.imshow(equalized_image, cmap='gray')
plt.show()

2. Canny 边缘检测

Canny 边缘检测是一种多级边缘检测算法,能够检测出图像中的边缘。

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 应用 Canny 边缘检测
edges = cv2.Canny(image, 100, 200)

# 显示原图和边缘检测结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Edges')
plt.imshow(edges, cmap='gray')
plt.show()

3. Hough 变换

Hough 变换用于检测图像中的直线和圆等几何形状。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 应用 Canny 边缘检测
edges = cv2.Canny(image, 50, 150)

# 应用 Hough 变换检测直线
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold=100, minLineLength=100, maxLineGap=10)

# 绘制检测到的直线
line_image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(line_image, (x1, y1), (x2, y2), (0, 255, 0), 2)

# 显示原图和检测结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Detected Lines')
plt.imshow(line_image)
plt.show()

4. SIFT 特征检测

SIFT(Scale-Invariant Feature Transform)是一种用于图像特征检测和描述的算法。

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 创建 SIFT 对象
sift = cv2.SIFT_create()

# 检测关键点和描述符
keypoints, descriptors = sift.detectAndCompute(image, None)

# 绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 显示原图和关键点
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Image with Keypoints')
plt.imshow(image_with_keypoints, cmap='gray')
plt.show()

5. SURF 特征检测

SURF(Speeded-Up Robust Features)是 SIFT 的一种快速版本。

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 创建 SURF 对象
surf = cv2.xfeatures2d.SURF_create(400)

# 检测关键点和描述符
keypoints, descriptors = surf.detectAndCompute(image, None)

# 绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 显示原图和关键点
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Image with Keypoints')
plt.imshow(image_with_keypoints, cmap='gray')
plt.show()

6. ORB 特征检测

ORB(Oriented FAST and Rotated BRIEF)是一种高效的特征检测和描述算法。

import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 创建 ORB 对象
orb = cv2.ORB_create()

# 检测关键点和描述符
keypoints, descriptors = orb.detectAndCompute(image, None)

# 绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 显示原图和关键点
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Image with Keypoints')
plt.imshow(image_with_keypoints, cmap='gray')
plt.show()

7. K-Means 聚类

K-Means 是一种常用的聚类算法,可以用于图像分割。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg')

# 将图像转换为二维数组
Z = image.reshape((-1, 3))

# 将数据类型转换为 float32
Z = np.float32(Z)

# 定义 K-Means 参数
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 3
ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

# 将中心值转换为 uint8
center = np.uint8(center)

# 将标签映射回图像
res = center[label.flatten()]
segmented_image = res.reshape((image.shape))

# 显示原图和分割后的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.subplot(1, 2, 2)
plt.title('Segmented Image')
plt.imshow(cv2.cvtColor(segmented_image, cv2.COLOR_BGR2RGB))
plt.show()

8. 主成分分析(PCA)

PCA 是一种常用的数据降维技术,可以用于图像压缩。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('example.jpg', 0)  # 以灰度模式读取图像

# 将图像转换为二维数组
Z = image.reshape((-1, 1))

# 将数据类型转换为 float32
Z = np.float32(Z)

# 应用 PCA
mean, eigenvectors = cv2.PCACompute(Z, mean=None)

# 选择前 n 个主成分
n_components = 50
projected = cv2.PCAProject(Z, mean, eigenvectors[:, :n_components])

# 重构图像
reconstructed = cv2.PCABackProject(projected, mean, eigenvectors[:, :n_components])
reconstructed_image = reconstructed.reshape(image.shape).astype(np.uint8)

# 显示原图和重构后的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.title('Reconstructed Image')
plt.imshow(reconstructed_image, cmap='gray')
plt.show()

9. 卷积神经网络(CNN)

CNN 是深度学习中的一种常用模型,特别适用于图像识别任务。

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

# 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255

# 构建 CNN 模型
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')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_split=0.2)

# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')

# 绘制训练过程中的损失和准确率
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.show()

10. YOLOv5 目标检测

YOLO(You Only Look Once)是一种实时目标检测算法,YOLOv5 是其最新版本。

import torch
from PIL import Image
import matplotlib.pyplot as plt

# 加载预训练的 YOLOv5 模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

# 读取图像
image = Image.open('example.jpg')

# 进行目标检测
results = model(image)

# 显示检测结果
results.show()

实战案例:手写数字识别

假设我们需要构建一个手写数字识别系统,可以使用上面提到的 CNN 模型来实现。我们将使用 MNIST 数据集进行训练和测试。

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

# 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255

# 构建 CNN 模型
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')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_split=0.2)

# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')

# 绘制训练过程中的损失和准确率
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.show()

本文介绍了 Python 图像识别的 10 个经典算法,包括直方图均衡化、Canny 边缘检测、Hough 变换、SIFT 特征检测、SURF 特征检测、ORB 特征检测、K-Means 聚类、主成分分析(PCA)、卷积神经网络(CNN)和 YOLOv5 目标检测。通过实际代码示例,我们展示了如何应用这些算法来处理图像。

来源:手把手PythonAI编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯