大家好,我是微学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中常用的高级视觉操作的概览。每个操作都有其特定的应用场景和参数设置,可以根据实际需求进行调整。在实际应用中,可能需要结合多种操作来达到预期的图像处理效果。