OPENCV-0.2
官方文档
学习安排
- 图像基础
- 图像操作
- 图像滤波
- 图像变换
图像基础
像素
访问和修改像素值
代码
import cv2
image = 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到灰度的转换
代码
import cv2
image = 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 cv2
image = 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() # 关闭窗口
结果
图像操作
裁剪
代码
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()
结果
其中:
旋转和翻转
代码
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()
结果
图像滤波
平滑和模糊图像
代码
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) # 核大小为5
cv2.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,最大阈值200
cv2.imshow('Sobelx', sobelx)
cv2.imshow('Sobely', sobely)
cv2.imshow('sobel_combined', sobel_combined)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
图像变换
仿射变换
代码
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()
结果
透视变换
代码
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算法进行边缘检测,这些滤波和边缘检测技术对于去除噪声和提取图像特征极为重要。最后,仿射变换和透视变换,这两种图像变换技术能够进行更复杂的图像形变和视角变换。