人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作与代码详解。在上一节课中的OpenCV基础操作我们了解到OpenCV是一个开源的计算机视觉软件库。它提供了各种视觉处理函数,并支持多种编程语言,如C++、Python、Java等。OpenCV具有跨平台性,可以在不同的操作系统上运行。它广泛应用于图像处理、视频分析、物体识别、人脸识别、动作识别等领域。

文章目录

  • 一、Opencv的高级操作
    • [1. 图像仿射变换](#1. 图像仿射变换)
    • [2. 图像形态学操作](#2. 图像形态学操作)
    • [3. 图像滤波操作](#3. 图像滤波操作)
    • [4. 图像傅里叶变换](#4. 图像傅里叶变换)
    • [5. 图像直方图均衡化](#5. 图像直方图均衡化)
    • [6. 图像Canny算子操作](#6. 图像Canny算子操作)
    • [7. 图像轮廓绘制与查找](#7. 图像轮廓绘制与查找)
    • [8. 图像边界检测](#8. 图像边界检测)
    • [9. 图像轮廓性质](#9. 图像轮廓性质)
    • [10. 图像金字塔操作](#10. 图像金字塔操作)
    • [11. 霍夫变换操作](#11. 霍夫变换操作)
    • [12. 分水岭算法](#12. 分水岭算法)

一、Opencv的高级操作

1. 图像仿射变换

图像仿射变换是一种二维变换,它保持了图像的直线和平行性。常用于图像校正和变换。

python 复制代码
import cv2
import numpy as np
# 读取图像
image = cv2.imread('example.jpg')
# 定义仿射变换矩阵
rows, cols = image.shape[:2]
M = cv2.getAffineTransform(np.float32([[50,50],[200,50],[50,200]]), np.float32([[10,100],[200,50],[100,250]]))
# 应用仿射变换
warped = cv2.warpAffine(image, M, (cols, rows))
# 显示图像
cv2.imshow('Original', image)
cv2.imshow('Warped', warped)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 图像形态学操作

图像形态学操作包括腐蚀、膨胀、开运算和闭运算等,用于图像的形状分析和特征提取。

python 复制代码
# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((5,5), np.uint8)
# 腐蚀操作
erosion = cv2.erode(gray, kernel, iterations=1)
# 显示图像
cv2.imshow('Original', gray)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像滤波操作

图像滤波操作用于平滑图像或去除图像中的噪声。

python 复制代码
# 读取图像
image = cv2.imread('example.jpg')
# 均值滤波
blur = cv2.blur(image, (5,5))
# 显示图像
cv2.imshow('Original', image)
cv2.imshow('Blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 图像傅里叶变换

图像傅里叶变换将图像从空间域转换到频率域,用于图像分析和频域滤波。

python 复制代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 傅里叶变换
dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 频率谱
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 显示图像
plt.subplot(121), plt.imshow(gray, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

5. 图像直方图均衡化

直方图均衡化用于增强图像的对比度。

python 复制代码
# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 直方图均衡化
equalized = cv2.equalizeHist(gray)
# 显示图像
cv2.imshow('Original', gray)
cv2.imshow('Equalized', equalized)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 图像Canny算子操作

Canny边缘检测算法用于检测图像中的边缘。

python 复制代码
# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# Canny边缘检测
edges = cv2.Canny(gray, 100, 200)
# 显示图像
cv2.imshow('Original', gray)
cv2.imshow('Canny', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 图像轮廓绘制与查找

用于在图像中查找和绘制轮廓。

python 复制代码
# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 边缘检测
edged = cv2.Canny(gray, 30, 100)
# 查找轮廓
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(image, contours, -1, (0,255,0), 3)
# 显示图像
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

8. 图像边界检测

边界检测通常使用Sobel算子实现,用于检测图像中的水平和垂直边界。

python 复制代码
import cv2
import numpy as np

# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 使用Sobel算子进行边界检测
# 参数分别是:图像,深度,x方向上的导数阶数,y方向上的导数阶数,核的大小
grad_x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
grad_y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)

# 将梯度转换回8位整数
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)

# 合并梯度
grad = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)

# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Sobel', grad)
cv2.waitKey(0)
cv2.destroyAllWindows()

9. 图像轮廓性质

轮廓性质包括轮廓的面积、周长、重心等,这些属性可以用于图像分析和物体识别。

python 复制代码
import cv2
# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Canny检测边缘
edges = cv2.Canny(image, 100, 200)
# 查找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 假设我们只对第一个轮廓感兴趣
if len(contours) > 0:
    cnt = contours[0]
    # 计算轮廓的面积
    area = cv2.contourArea(cnt)
    # 计算轮廓的周长
    perimeter = cv2.arcLength(cnt, True)
    # 计算轮廓的重心
    M = cv2.moments(cnt)
    cx = int(M['m10'] / M['m00'])
    cy = int(M['m01'] / M['m00'])
    # 绘制重心
    cv2.circle(image, (cx, cy), 5, (255, 0, 0), -1)
    # 显示结果
    cv2.imshow('Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    print(f'Area: {area}, Perimeter: {perimeter}, Centroid: ({cx}, {cy})')

10. 图像金字塔操作

图像金字塔是图像的多尺度表示,用于图像的尺寸变换和特征提取。

python 复制代码
import cv2
# 读取图像
image = cv2.imread('example.jpg')
# 构建高斯金字塔
gaussian_pyramid = [image]
for i in range(5):
    image = cv2.pyrDown(image)
    gaussian_pyramid.append(image)
# 显示高斯金字塔
for i in range(len(gaussian_pyramid)):
    cv2.imshow(f'Gaussian Pyramid {i}', gaussian_pyramid[i])
cv2.waitKey(0)
cv2.destroyAllWindows()

11. 霍夫变换操作

霍夫变换用于检测图像中的直线或圆。

python 复制代码
import cv2
import numpy as np
# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Canny检测边缘
edges = cv2.Canny(image, 50, 150)
# 霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
# 绘制检测到的直线
if lines is not None:
    for rho, theta in lines[:, 0]:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + 1000 * (-b))
        y1 = int(y0 + 1000 * (a))
        x2 = int(x0 - 1000 * (-b))
        y2 = int(y0 - 1000 * (a))
        cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 显示结果
cv2.imshow('Hough Lines', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

12. 分水岭算法

分水岭算法是一种图像分割算法,用于根据图像的灰度将图像分割成不同的区域。

python 复制代码
import cv2
import numpy as np
# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 二值化
_, thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建标记
marker = np.zeros_like(image)
# 为每个轮廓创建一个不同的标签
for i in range(len(contours)):
    cv2.drawContours(marker, contours, i, (i+1), -1)
# 应用 watershed 算法
marker = cv2.watershed(image, marker)
# 显示结果
cv2.imshow('Watershed', marker)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码提供了OpenCV中常用的高级视觉操作的概览。每个操作都有其特定的应用场景和参数设置,可以根据实际需求进行调整。在实际应用中,可能需要结合多种操作来达到预期的图像处理效果。

相关推荐
DARLING Zero two♡4 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
神秘的土鸡7 分钟前
神经网络图像隐写术:用AI隐藏信息的艺术
人工智能·深度学习·神经网络
数据分析能量站8 分钟前
神经网络-LeNet
人工智能·深度学习·神经网络·机器学习
Jaly_W16 分钟前
用于航空发动机故障诊断的深度分层排序网络
人工智能·深度学习·故障诊断·航空发动机
小嗷犬18 分钟前
【论文笔记】Cross-lingual few-shot sign language recognition
论文阅读·人工智能·多模态·少样本·手语翻译
夜幕龙25 分钟前
iDP3复现代码数据预处理全流程(二)——vis_dataset.py
人工智能·python·机器人
吃个糖糖43 分钟前
36 Opencv SURF 关键点检测
人工智能·opencv·计算机视觉
AI慧聚堂1 小时前
自动化 + 人工智能:投标行业的未来是什么样的?
运维·人工智能·自动化
盛世隐者1 小时前
【pytorch】循环神经网络
人工智能·pytorch
游是水里的游1 小时前
【算法day19】回溯:分割与子集问题
算法