当前位置: 首页 > news >正文

数字图像处理基础——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转RGB
  • COLOR_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视频编码

http://www.lryc.cn/news/614821.html

相关文章:

  • 算法_python_牛客华为机试笔记_01
  • 【Python 高频 API 速学 ③】
  • RecyclerView 中 ViewHolder
  • TDengine IDMP 快速体验(1. 通过云服务)
  • 【CVPR2025】计算机视觉|PX:让模型训练“事半功倍”!
  • vscode/trae 的 settings.json 中配置 latex 的一些记录
  • 设备点检系统二维码的应用
  • 我用C++和零拷贝重构了文件服务器,性能飙升3倍,CPU占用降低80%
  • Amazon Linux 训练lora模型的方式
  • 《算法导论》第 14 章 - 数据结构的扩张
  • ruoyi关闭shiro校验,任何接口可以直接访问
  • C++-红黑树
  • [C/C++线程安全]_[中级]_[多线程如何使用共享锁提升性能]
  • Meta AI水印计划的致命缺陷——IEEE Spectrum深度文献精读
  • 第4章 程序段的反复执行4.2while语句P128练习题(题及答案)
  • ppt 生成视频的 ai 大模型全面解析
  • (talk)西安大模型开发者talk
  • vue+flask大模型写诗诗词推荐与可视化系统
  • 浏览器面试题及详细答案 88道(01-11)
  • 项目一系列-第4章 在线接口文档 代码模板改造
  • AJAX与axios框架
  • Netty-Rest搭建笔记
  • 系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇
  • 轻松实现浏览器自动化——AI浏览器自动化框架Stagehand
  • 【华为机试】63. 不同路径 II
  • C++简单项目跟练【通讯录管理系统000】
  • 数据集: TSPLIB旅行商问题-对称TSP数据集
  • 宁商平台税务升级之路:合规为纲,服务为本
  • 五、SpringBoot工程打包与运行
  • 解决 MinIO 上传文件时报 S3 API Requests must be made to API port错误