数字图像处理基础——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的安装

bash 复制代码
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
 
bash 复制代码
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple
 
#加载contrib包
markdown 复制代码
# 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

图像保存
python 复制代码
# 保存图像
cv2.imwrite('output.png', img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

支持格式:JPEG、PNG、TIFF等,可通过参数控制压缩质量

2. 图像显示

python 复制代码
cv2.imshow('Image Window', image)
cv2.waitKey(0)  # 0表示无限等待按键,单位毫秒
cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

实际应用时可添加键盘交互:

python 复制代码
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):  # 按q键退出
    break

3. 图像属性分析

python 复制代码
print("图像维度:", img.shape)  # (height, width, channels)
print("像素总数:", img.size)   # height × width × channels
print("数据类型:", img.dtype)  # 通常是uint8

典型输出:

  • 彩色图像:(480, 640, 3)
  • 灰度图像:(480, 640)

二、图像处理技术

1. 颜色空间转换

python 复制代码
# 转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

常用转换:

  • COLOR_BGR2RGB:BGR转RGB
  • COLOR_BGR2Lab:转换到Lab色彩空间
  • COLOR_BGR2YCrCb:转换到YCrCb色彩空间

2. 图像滤波

高斯模糊
python 复制代码
blurred = cv2.GaussianBlur(img, (5,5), 0)
  • 参数说明:(核宽度,核高度),标准偏差
中值滤波
python 复制代码
median = cv2.medianBlur(img, 5)
  • 对椒盐噪声特别有效
双边滤波
python 复制代码
blur = cv2.bilateralFilter(img, 9, 75, 75)
  • 在保持边缘锐利的同时平滑图像

3. 边缘检测

Canny边缘检测
python 复制代码
edges = cv2.Canny(img, 100, 200)
  • 双阈值设置很关键:threshold1, threshold2
Sobel算子
python 复制代码
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. 几何变换

图像缩放
python 复制代码
resized = cv2.resize(img, (new_width, new_height), 
                    interpolation=cv2.INTER_LINEAR)

插值方法:

  • INTER_NEAREST:最近邻插值
  • INTER_LINEAR:双线性插值(默认)
  • INTER_CUBIC:双三次插值
图像旋转
python 复制代码
(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特征
python 复制代码
sift = cv2.SIFT_create()
keypoints = sift.detect(img, None)
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)
ORB特征
python 复制代码
orb = cv2.ORB_create(nfeatures=500)
keypoints, descriptors = orb.detectAndCompute(img, None)

2. 特征匹配

暴力匹配(BFMatcher)
python 复制代码
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匹配器
python 复制代码
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. 阈值分割

全局阈值
python 复制代码
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
自适应阈值
python 复制代码
thresh = cv2.adaptiveThreshold(gray, 255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                              cv2.THRESH_BINARY, 11, 2)

2. 轮廓检测

python 复制代码
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. 视频捕获

python 复制代码
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'):
        break

cap.release()

2. 视频写入

python 复制代码
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视频编码
复制代码
相关推荐
Dxy123931021620 分钟前
Python合并两个PDF文件
python·pdf
whaosoft-14323 分钟前
51c自动驾驶~合集13
人工智能
双向3328 分钟前
Agent在游戏行业的应用:NPC智能化与游戏体验提升
人工智能
OAFD.39 分钟前
Matplotlib 入门到实战:从零开始学 Python 数据可视化
python·信息可视化·matplotlib
WSSWWWSSW44 分钟前
Numpy科学计算与数据分析:Numpy广播机制入门与实践
python·数据挖掘·数据分析·numpy
Eloudy1 小时前
矩阵的条件数 向量的条件数
人工智能·机器学习·矩阵分析
七月稻草人1 小时前
飞算JavaAI:人工智能与Java的创新融合与应用前景
开发语言·人工智能·ai编程·java开发·飞算javaai炫技赛
张登杰踩1 小时前
OpenCV cv2.flip() 函数详解与示例
人工智能·opencv·计算机视觉
是乐谷1 小时前
饿了么招java开发咯
java·开发语言·人工智能·程序人生·面试·职场和发展
Mory_Herbert2 小时前
【李宏毅-2024】第六讲 大语言模型的训练过程1——预训练(Pre-training)
人工智能·语言模型·自然语言处理