OPENCV-0.2
- 学习安排
- 图像基础
- 像素
- 访问和修改像素值
- 色彩空间转换
- RGB到灰度的转换
- RGB到HSV的转换
- 图像操作
- 裁剪
- 缩放
- 旋转和翻转
- 图像滤波
- 平滑和模糊图像
- 边缘检测
- 图像变换
- 仿射变换
- 透视变换
- 总结
官方文档
学习安排
- 图像基础
像素
:了解像素的概念,包括像素值的意义(如RGB颜色空间中的R、G、B值),以及如何访问和修改图像的像素值。色彩空间转换
:学习如何在不同的色彩空间之间转换图像,例如从RGB转换到灰度、HSV(色调、饱和度、亮度)等。这对于图像处理的很多应用都是基础,例如在特定色彩空间中更容易地进行颜色检测和跟踪。
- 图像操作
图像裁剪
:学习如何裁剪图像的特定区域。这在需要关注图像的某一部分时非常有用。缩放
:了解如何改变图像的尺寸,包括使用不同的插值方法来优化缩放的效果。旋转和翻转
:学习如何对图像进行旋转和翻转操作,这对于图像校正或增强用户体验很有帮助。
- 图像滤波
平滑和模糊图像
:掌握使用不同类型的滤波器(如均值滤波、高斯滤波等)来平滑或模糊图像,这对于去噪或降低图像的细节级别很有用。边缘检测算法
:学习使用如Canny边缘检测器来识别图像中的边缘。边缘检测是许多图像处理任务(如图像分割、物体检测等)的重要步骤。
- 图像变换
仿射变换
:了解如何使用仿射变换来进行图像的平移、缩放、旋转以及倾斜校正。透视变换
:学习透视变换的原理和应用,如何利用透视变换进行图像的矫正和视角变换,这在进行图像分析和增强现实应用中非常重要。
图像基础
像素
像素,或称图像元素
,是构成数字图像的基本单位。每个像素包含了该点的颜色信息,对于彩色图像来说,通常使用RGB色彩模型,其中R、G、B分别代表红色、绿色和蓝色通道的强度值。在计算机中,这些值通常范围从0到255。
访问和修改像素值
代码
import cv2image = cv2.imread('../image.jpg')
# 访问坐标为(0, 0)的像素值
pixel_value = image[0, 0]
print(pixel_value) # 对于彩色图像,这将打印出[B, G, R]值# 修改坐标为(0, 0)的像素值
image[0, 0] = [255, 255, 255] # 将此像素修改为白色
print(image[0, 0])
结果
色彩空间转换
色彩空间
是一种用来表示、组织和创建颜色的方法。除了常见的RGB色彩空间外,还有很多其他色彩空间,如HSV(Hue, Saturation, Value/色调、饱和度、亮度)、LAB等。不同的色彩空间对于某些图像处理任务更为适合。
RGB到灰度的转换
代码
import cv2image = cv2.imread('../image.jpg')gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)cv2.imshow('Original Image', image)
cv2.imshow('Grayscale Image', gray_image)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 关闭窗口
结果
RGB到HSV的转换
代码
import cv2image = cv2.imread('../image.jpg')hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)cv2.imshow('Original Image', image)
cv2.imshow('Hsv Image', hsv_image)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 关闭窗口
结果
图像操作
裁剪
是指从原图中选择一个感兴趣的区域(ROI,Region of Interest)并提取出来。
通过数组切片的方式来裁剪图像。
代码
import cv2# 加载图像
image = cv2.imread('../image.jpg')# 裁剪图像
# 假设我们想裁剪坐标在 x1:x2 和 y1:y2 的区域
x1, y1, x2, y2 = 100, 100, 300, 300
cropped_image = image[y1:y2, x1:x2]
cv2.imshow('Original Image', image)
# 显示裁剪后的图像
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
缩放
是改变图像尺寸的过程。
代码
import cv2# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)# 将图像缩放到指定的新尺寸
new_width, new_height = 200, 200
INTER_LINEAR_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
INTER_NEAREST_image = cv2.resize(image, (new_width * 2, new_height * 2), interpolation=cv2.INTER_NEAREST)
INTER_AREA_image = cv2.resize(image, (new_width // 2, new_height // 2), interpolation=cv2.INTER_AREA)
INTER_CUBIC_image = cv2.resize(image, (new_width * 3, new_height * 3), interpolation=cv2.INTER_CUBIC)# 显示缩放后的图像
cv2.imshow('INTER_LINEAR', INTER_LINEAR_image)
cv2.imshow('INTER_NEAREST', INTER_NEAREST_image)
cv2.imshow('INTER_AREA', INTER_AREA_image)
cv2.imshow('INTER_CUBIC', INTER_CUBIC_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
其中:
常用的插值方法包括:
cv2.INTER_LINEAR
:线性插值,适合缩放cv2.INTER_NEAREST
:最近邻插值,速度最快cv2.INTER_AREA
:使用像素区域关系,适合缩小图像cv2.INTER_CUBIC
:三次样条插值,适合放大图像
旋转和翻转
旋转是将图像围绕其中心点旋转给定角度的过程.
翻转是沿水平或垂直轴反转图像。
代码
import cv2# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
# 旋转图像
center = (image.shape[1] // 2, image.shape[0] // 2) # 图像中心点
angle = 90 # 旋转角度
scale = 1.0 # 缩放比例
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (image.shape[1], image.shape[0]))# 翻转图像
flipped_image = cv2.flip(image, 1) # 1表示水平翻转,0表示垂直翻转# 显示旋转和翻转后的图像
cv2.imshow('Rotated Image', rotated_image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()cv2.imshow('Flipped Image', flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
图像滤波
平滑和模糊图像
图像的平滑和模糊处理通常用于去除噪声或降低图像的细节。
可以通过各种低通滤波器(LPF)来实现,低通滤波器有助于去除图像中的高频内容(如边缘、噪声等)
代码
import cv2# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
blur = cv2.blur(image, (5, 5)) # 使用5x5的核进行均值滤波
gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0) # 5x5高斯核,标准差由函数自动计算
median_blur = cv2.medianBlur(image, 5) # 核大小为5cv2.imshow('blur', blur)
cv2.imshow('gaussian_blur', gaussian_blur)
cv2.imshow('median_blur', median_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
边缘检测
边缘检测是图像处理中用于识别图像中对象边界的技术。它主要依赖于检测图像亮度的突变,这些突变通常对应于图像中的边缘。
代码
import cv2# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
# Sobel算子:在水平和垂直方向上检测边缘
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5) # 水平方向
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5) # 垂直方向
sobel_combined = cv2.addWeighted(cv2.convertScaleAbs(sobelx), 0.5, cv2.convertScaleAbs(sobely), 0.5, 0) # 合并
# Canny边缘检测:Canny算法是一种流行的边缘检测算法,因为它是自适应的,且效果较好。
edges = cv2.Canny(image, 100, 200) # 最小阈值100,最大阈值200cv2.imshow('Sobelx', sobelx)
cv2.imshow('Sobely', sobely)
cv2.imshow('sobel_combined', sobel_combined)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
图像变换
仿射变换
仿射变换(Affine Transformation)是一种二维图像变换,它包括旋转、缩放、平移和倾斜等变换。仿射变换的特点是直线在变换后仍然是直线,平行线仍然保持平行,但圆形可能变为椭圆。
代码
import cv2
import numpy as np# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
rows, cols, ch = image.shape# 原图中的三个点及其在输出图像中的目标位置
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 生成仿射变换矩阵并应用它
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(image, M, (cols, rows))cv2.imshow('Affine Transformation', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
透视变换
透视变换(Perspective Transformation)允许图像进行更复杂的变形,比如从一个视角到另一个视角的变换,可以用来模拟相机视角的改变,例如实现全景图的拼接。在透视变换中,需要指定图像上的四个点及其对应在输出图像中的位置。
代码
import cv2
import numpy as np# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
rows, cols, ch = image.shape# 假设pts1是图像上的四个点,pts2是变换后的目标位置
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])# 生成透视变换矩阵并应用它
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(image, M, (300, 300))cv2.imshow('Perspective Transformation', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
总结
在本次图像处理基础学习阶段,深入了解像素和色彩空间转换的概念,包括如何在RGB、灰度和HSV等色彩空间之间转换图像。图像的基本操作技巧,如裁剪、缩放、旋转和翻转,这些操作是图像处理中不可或缺的部分。此外,我通过均值滤波、高斯滤波和中值滤波等方法对图像进行平滑和模糊处理,以及利用Sobel算子和Canny算法进行边缘检测,这些滤波和边缘检测技术对于去除噪声和提取图像特征极为重要。最后,仿射变换和透视变换,这两种图像变换技术能够进行更复杂的图像形变和视角变换。