[Day 46] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

計算機視覺技術的應用開發

簡介

計算機視覺是人工智能的一個分支,旨在讓機器像人類一樣理解和解釋視覺世界。它包括圖像和視頻的捕獲、處理和分析,從而提取有用的信息以便進一步操作。計算機視覺的應用範圍廣泛,包括人臉識別、自動駕駛、醫療影像分析、安防監控等。

在本章中,我們將深入探討計算機視覺的應用開發,從基本概念開始,到實際代碼實現。我們將使用Python和OpenCV來演示圖像處理技術,並討論如何應用這些技術來解決實際問題。

計算機視覺的基本概念

計算機視覺的基本概念包括圖像處理、特徵提取、圖像分類和對象檢測等。這些技術構成了計算機視覺應用的基礎。

  1. 圖像處理:對圖像進行基本操作,如縮放、旋轉、裁剪、平滑和邊緣檢測等。
  2. 特徵提取:從圖像中提取有用的信息,如邊緣、角點和紋理等。
  3. 圖像分類:根據圖像的特徵將其分類到不同的類別中。
  4. 對象檢測:在圖像中識別並定位特定的對象。
圖像處理技術

我們首先從圖像處理技術開始,這是計算機視覺的基礎。我們將使用OpenCV來進行圖像處理。

圖像讀取與顯示

在開始圖像處理之前,我們需要讀取和顯示圖像。以下是使用OpenCV讀取和顯示圖像的基本代碼:

import cv2

# 讀取圖像
image = cv2.imread('image.jpg')

# 顯示圖像
cv2.imshow('Image', image)

# 等待按鍵按下後關閉顯示窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.imread('image.jpg'):讀取圖像,返回一個包含圖像數據的NumPy數組。
  • cv2.imshow('Image', image):顯示圖像。
  • cv2.waitKey(0):等待任意鍵按下。
  • cv2.destroyAllWindows():關閉所有OpenCV顯示窗口。
圖像縮放

圖像縮放是將圖像的大小進行改變,這在許多應用中都很常見。以下是圖像縮放的代碼:

# 縮放圖像
resized_image = cv2.resize(image, (300, 300))

# 顯示縮放後的圖像
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.resize(image, (300, 300)):將圖像縮放到300x300像素。
圖像旋轉

圖像旋轉是將圖像繞著某個點旋轉,以下是圖像旋轉的代碼:

# 獲取圖像中心
(h, w) = image.shape[:2]
center = (w // 2, h // 2)

# 設定旋轉矩陣
M = cv2.getRotationMatrix2D(center, 45, 1.0)

# 旋轉圖像
rotated_image = cv2.warpAffine(image, M, (w, h))

# 顯示旋轉後的圖像
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.getRotationMatrix2D(center, 45, 1.0):創建旋轉矩陣,45度旋轉,縮放因子為1。
  • cv2.warpAffine(image, M, (w, h)):應用旋轉矩陣,旋轉圖像。
圖像裁剪

圖像裁剪是從圖像中提取出某個區域,以下是圖像裁剪的代碼:

# 裁剪圖像
cropped_image = image[50:200, 50:200]

# 顯示裁剪後的圖像
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • image[50:200, 50:200]:裁剪圖像,提取從(50, 50)到(200, 200)的區域。
特徵提取技術

特徵提取是從圖像中提取有用的信息,如邊緣、角點和紋理等。這些特徵可以用來進行圖像分類和對象檢測。

邊緣檢測

邊緣檢測是計算機視覺中的一項基本技術,用於檢測圖像中的邊緣。以下是使用Canny邊緣檢測算法的代碼:

# 轉換為灰度圖像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 進行高斯模糊
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)

# 使用Canny邊緣檢測
edges = cv2.Canny(blurred_image, 50, 150)

# 顯示邊緣檢測結果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):將圖像轉換為灰度圖像。
  • cv2.GaussianBlur(gray_image, (5, 5), 0):對灰度圖像進行高斯模糊,降低噪聲。
  • cv2.Canny(blurred_image, 50, 150):使用Canny算法進行邊緣檢測,設置低閾值50和高閾值150。
角點檢測

角點是圖像中具有顯著變化的點,可以用來進行對象識別和追蹤。以下是使用Harris角點檢測的代碼:

# 轉換為灰度圖像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_image = np.float32(gray_image)

# 使用Harris角點檢測
corners = cv2.cornerHarris(gray_image, 2, 3, 0.04)

# 擴展角點標記
corners = cv2.dilate(corners, None)

# 設置閾值
image[corners > 0.01 * corners.max()] = [0, 0, 255]

# 顯示角點檢測結果
cv2.imshow('Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.cornerHarris(gray_image, 2, 3, 0.04):使用Harris角點檢測,窗口大小為2,Sobel算子的孔徑參數為3,Harris檢測器的自由參數為0.04。
  • cv2.dilate(corners, None):擴展角點標記。
  • image[corners > 0.01 * corners.max()] = [0, 0, 255]:設置閾值,標記角點。
圖像分類

圖像分類是將圖像分類到不同的類別中,我們可以使用卷積神經網絡(CNN)來進行圖像分類。以下是使用Keras框架構建和訓練簡單的CNN進行圖像分類的代碼:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# 構建CNN模型
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
    MaxPooling2D((2, 2)),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D((2, 2)),
    Conv2D(128, (3, 3), activation='relu'),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dense(10, activation='softmax')
])

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

# 準備數據集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()

# 正規化數據
train_images, test_images = train_images / 255.0, test_images / 255.0

# 訓練模型
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
  • Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)):第一個卷積層,有32個3x3的卷積核,使用ReLU激活函數,輸入圖像大小為64x64x3。
  • MaxPooling2D((2, 2)):最大池化層,池化窗口大小為2x2。
  • Flatten():將多維數據展平成一維。
  • Dense(128, activation='relu'):全連接層,有128個神經元,使用ReLU激活函數。
  • Dense(10, activation='softmax'):輸出層,有10個神經元,使用softmax激活函數。
對象檢測

對象檢測是識別並定位圖像中的特定對象,我們可以使用YOLO(You Only Look Once)算法來進行對象檢測。以下是使用YOLO進行對象檢測的代碼:

import cv2
import numpy as np

# 載入YOLO模型
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 讀取圖像
image = cv2.imread('image.jpg')
height, width = image.shape[:2]

# 預處理圖像
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)

# 前向傳播
outs = net.forward(output_layers)

# 解析結果
class_ids = []
confidences = []
boxes = []
for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5:
            center_x = int(detection[0] * width)
            center_y = int(detection[1] * height)
            w = int(detection[2] * width)
            h = int(detection[3] * height)
            x = int(center_x - w / 2)
            y = int(center_y - h / 2)
            boxes.append([x, y, w, h])
            confidences.append(float(confidence))
            class_ids.append(class_id)

# 非極大值抑制
indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

# 畫出檢測結果
for i in range(len(boxes)):
    if i in indices:
        x, y, w, h = boxes[i]
        label = str(classes[class_ids[i]])
        confidence = confidences[i]
        color = colors[class_ids[i]]
        cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
        cv2.putText(image, f'{label} {confidence:.2f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

# 顯示結果圖像
cv2.imshow('Object Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg'):載入YOLO模型。
  • cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False):將圖像轉換為YOLO需要的輸入格式。
  • net.setInput(blob):設置網絡輸入。
  • net.forward(output_layers):前向傳播,獲得檢測結果。
  • cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4):非極大值抑制,去除重疊框。
  • cv2.rectangle(image, (x, y), (x + w, y + h), color, 2):畫出檢測框。
  • cv2.putText(image, f'{label} {confidence:.2f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2):在檢測框上顯示標籤和置信度。
結論

計算機視覺技術在現代科技中扮演著重要角色,從基礎的圖像處理到複雜的對象檢測,這些技術在各個領域都有廣泛應用。通過本文的介紹和實踐代碼,我們了解了如何使用OpenCV和深度學習框架來開發計算機視覺應用。希望這些知識能幫助讀者在實際項目中更好地應用計算機視覺技術。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值