数字图像处理基础——opencv库(Python)
一、数字图像处理技术详解
数字图像处理是指使用计算机算法对数字图像进行分析、增强、压缩和解释的技术。这一技术已广泛应用于医疗影像、卫星遥感、工业检测、安防监控、数码摄影等多个领域。以下是该领域的关键知识点:
图像基础概念
1. 数字图像表示
像素矩阵:图像由二维矩阵表示,每个元素为像素值。例如,一张800×600的图像实际上是一个包含480,000个像素点的矩阵。在计算机中,这个矩阵以数组形式存储,每个像素点的位置由其行号和列号唯一确定。
灰度图像:单通道图像,每个像素值仅表示该点的亮度信息。通常使用8位表示(0-255),其中0代表纯黑,255代表纯白。在医学影像(如X光片)和部分工业检测场景中常用。
彩色图像:多通道图像,最常见的是RGB三通道(红、绿、蓝)模式。每个通道都是一个独立的矩阵,组合起来形成彩色图像。例如:
- JPEG照片通常采用RGB格式
- 印刷行业常用CMYK四色模式
- 遥感图像可能包含更多光谱通道(如红外波段)
2. 图像属性
分辨率:指单位长度内的像素数,常用单位有DPI(每英寸点数)或PPI(每英寸像素数)。例如:
- 屏幕显示通常为72-96DPI
- 印刷品要求300DPI或更高
- 4K超高清电视的分辨率为3840×2160像素
位深度:表示每个像素使用的数据位数,决定了图像的色彩丰富度。常见类型包括:
- 1位:黑白二值图像
- 8位:256色(灰度或索引色)
- 24位:真彩色(每个RGB通道8位,共约1677万色)
- 48位:高动态范围图像(每个通道16位)
宽高比:图像宽度与高度的比例关系。标准比例包括:
- 4:3(传统电视、早期显示器)
- 16:9(高清电视、现代显示器)
- 1:1(正方形,如Instagram照片)
- 3:2(35mm胶片比例)
此外,图像处理还需要考虑色彩空间(如sRGB、Adobe RGB)、文件格式(JPEG、PNG、TIFF等)以及压缩方式(有损/无损)等其他重要属性。
二、opencv库
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于图像处理、视频分析、人脸识别、物体检测等领域。
1.opencv的安装
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple#加载contrib包
# OpenCV 图像处理完整指南# 一、基础图像操作# 1. 图像读写# 图像读取
```python'''
import cv2
# 读取图像
img = cv2.imread('image.jpg', flags=cv2.IMREAD_COLOR)
常用读取标志(flags):
cv2.IMREAD_COLOR
:以BGR三通道彩色图像加载(默认选项)cv2.IMREAD_GRAYSCALE
:以单通道灰度图像加载cv2.IMREAD_UNCHANGED
:保留图像原始格式,包括alpha通道
示例:读取PNG透明背景图片应使用
cv2.IMREAD_UNCHANGED
图像保存
# 保存图像
cv2.imwrite('output.png', img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
支持格式:JPEG、PNG、TIFF等,可通过参数控制压缩质量
2. 图像显示
cv2.imshow('Image Window', image)
cv2.waitKey(0) # 0表示无限等待按键,单位毫秒
cv2.destroyAllWindows() # 关闭所有OpenCV窗口
实际应用时可添加键盘交互:
key = cv2.waitKey(1) & 0xFF
if key == ord('q'): # 按q键退出break
3. 图像属性分析
print("图像维度:", img.shape) # (height, width, channels)
print("像素总数:", img.size) # height × width × channels
print("数据类型:", img.dtype) # 通常是uint8
典型输出:
- 彩色图像:(480, 640, 3)
- 灰度图像:(480, 640)
二、图像处理技术
1. 颜色空间转换
# 转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
常用转换:
COLOR_BGR2RGB
:BGR转RGBCOLOR_BGR2Lab
:转换到Lab色彩空间COLOR_BGR2YCrCb
:转换到YCrCb色彩空间
2. 图像滤波
高斯模糊
blurred = cv2.GaussianBlur(img, (5,5), 0)
- 参数说明:(核宽度,核高度),标准偏差
中值滤波
median = cv2.medianBlur(img, 5)
- 对椒盐噪声特别有效
双边滤波
blur = cv2.bilateralFilter(img, 9, 75, 75)
- 在保持边缘锐利的同时平滑图像
3. 边缘检测
Canny边缘检测
edges = cv2.Canny(img, 100, 200)
- 双阈值设置很关键:threshold1, threshold2
Sobel算子
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
- 可分别检测x方向和y方向的边缘
4. 几何变换
图像缩放
resized = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
插值方法:
INTER_NEAREST
:最近邻插值INTER_LINEAR
:双线性插值(默认)INTER_CUBIC
:双三次插值
图像旋转
(h, w) = img.shape[:2]
center = (w//2, h//2)
M = cv2.getRotationMatrix2D(center, 45, 1.0) # 旋转45度
rotated = cv2.warpAffine(img, M, (w, h))
三、特征检测与匹配
1. 关键点检测
SIFT特征
sift = cv2.SIFT_create()
keypoints = sift.detect(img, None)
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)
ORB特征
orb = cv2.ORB_create(nfeatures=500)
keypoints, descriptors = orb.detectAndCompute(img, None)
2. 特征匹配
暴力匹配(BFMatcher)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)
result = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None)
FLANN匹配器
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
四、图像分割
1. 阈值分割
全局阈值
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
自适应阈值
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)
2. 轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,255,0), 2)
轮廓检索模式:
RETR_EXTERNAL
:只检测外部轮廓RETR_LIST
:检测所有轮廓不建立层级关系RETR_TREE
:检测所有轮廓并建立完整的层级结构
五、视频处理
1. 视频捕获
cap = cv2.VideoCapture(0) # 0表示默认摄像头while True:ret, frame = cap.read()if not ret:break# 处理帧gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('frame', gray)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
2. 视频写入
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))for i in range(100):frame = get_frame() # 获取帧的方法out.write(frame)out.release()
常用视频编码:
- 'XVID': MPEG-4编码
- 'MJPG': Motion-JPEG编码
- 'MP4': MPEG-4视频编码