OPenCV — 计算机视觉库,于 1999 年在英特尔(Intel)启动,第一个版本于 2000 年发布。
OpenCV 支持多种 编程语言,如 C++、Python、 Java 等,并可在不同平台上运行,包括 Windows、Linux、OS X、Android 和 iOS。基于 CUDA 和 OpenCL 的高速 GPU 操作接口也处于积极开发中。
OpenCV-Python 是 OpenCV 的 Python API,本质上是原始 OpenCV C++ 实现的 Python 封装,它结合了 OpenCV C++ API 的高性能和 Python 语言的便捷性。
一、图像基本操作
1. cv2.imread()
该函数用于从指定文件路径(绝对路径或者相对路径)读取图像数据,是计算机视觉和图像处理领域中最基础和常用的函数之一。
. – 该函数通过图像内容而非文件扩展名来确定图像类型。 . – 对于彩色图像,解码后的图像通道将按 BGR 顺序存储。 . – 以灰度图模式读取,返回的是单通道8位灰度图。 . – 以透明度模式读取,如果原图有A通道,则返回的图像数据为BGRA四通道;若原图为RGB三通道彩色图,则返回的图像数据为BGR三通道。 . – 以 cv2.imread() 的默认模式读取 RGBA 通道的 PNG 图像,返回的图像是BGR 3通道,Alpha 通道会被丢弃。
# 读取彩色图像(默认)
img = cv2.imread('image.jpg')
# 读取灰度图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 读取带透明度的图像
img = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)
2. cv2.minMaxLoc()
该函数不适用于多通道数组。如果需要查找所有通道中的最小值或最大值元素,请先使用 Mat::reshape 将数组重新解释为单通道数组。或者,您可以使用 extractImageCOI、mixChannels 或 split 提取特定通道。
# 找到当前图像的最小和最大像素值
min_val, max_val, _, _ = cv2.minMaxLoc(depth_map)
二、图像变换
1. 取反 cv2.bitwise_not()
# a mask and its inverse mask
mask_inv = cv2.bitwise_not(mask)
2. 缩放 cv2.resize()
resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
# dsize设为none,水平和垂直方向的缩放因子为2,将图像宽高放大到原图的2倍
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
# 将图像宽高放大到原图的2倍,显式指定目标图像的大小(2*width, 2*height),fx和fy被忽略。
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)
resized_img=cv2.resize(img,(256,256))
该函数将图像 src 缩小或放大到指定尺寸。缩放(Scaling)本质上就是图像的尺寸调整。dst 为输出图像,它具有 dsize 的大小(当 dsize 不为零时)或根据 src.size()、fx 和 fy 计算出的大小;缩小图像时,通常使用 INTER_AREA 插值效果最好,而放大图像时,通常使用 INTER_CUBIC(速度慢)或 INTER_LINEAR(速度较快,但效果仍然可以接受)插值效果最好。
resize函数默认使用的是INTER_LINER双线性插值,双线性插值的核心就是向下取整(Floor)和向上取整(Ceil)来框定目标点所在的“格子”:4.3 位于 4 和 5 之间,5.7 位于 5 和 6 之间,最终得到的四个邻域像素坐标为这几个坐标的组合,小数部分相乘得到每个坐标的权重,相应坐标的像素值乘以权重得到目标像素的像素值。
补充介绍裁切(Crop):
-
使用裁切:当只需要图像中的某一部分(如人脸检测后的 ROI 提取),或者需要去除图像边缘的不必要背景时。
-
使用缩放:当需要统一不同尺寸图像的分辨率(如神经网络输入预处理),或者需要调整图像大小以适应显示屏幕或存储限制时。
OpenCV 中没有名为 cv2.crop 的函数。裁切通常利用 Python 中 NumPy 库对矩阵进行切片操作实现,效率极高。原理:直接访问图像数组的特定行和列范围
import cv2
import numpy as np
img = cv2.imread('input.jpg')
h,w,c = img.shape # 848 1919 3
# 裁切:从 y=100 到 y=300,x=100 到 x=400 的区域
# 注意:OpenCV 图像存储为 (行, 列) 即 (y, x) 格式
cropped_img = img[100:300, 100:400]
3. 上采样、下采样、超采样
上采样:放大图像尺寸,提高图像分辨率。使用插值算法(双线性、双三次),根据周围像素的颜色来计算新像素的颜色。经常应用于图像放缩显示、图像金字塔重建、超分辨率技术。
下采样:缩小图像尺寸,降低图像分辨率。为了防止直接丢弃像素导致画面出现锯齿(混叠现象,Aliasing),传统的下采样通常需要“先低通滤波(高斯模糊)+ 再抽取像素”,或者“按像素面积比例求平均”,达到把高密度像素网格压缩为低密度像素网格的目的。经常应用与图像缩略图显示、减小存储空间、减轻 CPU / GPU 处理负担。
超采样:调整图像分辨率,先放大渲染再缩小图像,达到抗锯齿与细节增强的效果。显卡在后台先以 4K(3840 x 2160)的分辨率渲染游戏画面,然后通过算法将画面“压缩”下采样到你的 1080p (1920 x 1080 )显示器上。因为显示器的每个像素点都是由后台 4 个高精度的点融合计算出来的,画面边缘会变得极其平滑细腻,几乎看不到锯齿。经常应用于游戏中的 SSAA(Supersampling Anti-Aliasing)、图形渲染、高质量印刷预处理。
基础且最常用的接口:
可同时实现上采样和下采样,其核心在于interpolation(插值参数)的选择:
import cv2
# 读取图像
img = cv2.imread('input.jpg')
# — 1. 下采样 (缩小图像) —
# 下采样强烈推荐使用 cv2.INTER_AREA(区域重采样),它基于像素覆盖面积求平均,能有效消除锯齿
downscaled = cv2.resize(img, (640, 360), interpolation=cv2.INTER_AREA)
# — 2. 上采样 (放大图像) —
# 上采样推荐使用 cv2.INTER_LINEAR (双线性) 或 cv2.INTER_CUBIC (双三次)
# INTER_CUBIC 计算量更大,但边缘比双线性更锐利
upsampled = cv2.resize(img, (3840, 2160), interpolation=cv2.INTER_CUBIC)
常见插值标志对比:
-
INTER_NEAREST:最近邻插值(速度极快,但放大有马赛克,缩小有严重锯齿)。
-
INTER_LINEAR:双线性插值(速度与效果平衡,OpenCV 默认参数)。
-
INTER_CUBIC:双三次插值(参考 4×4 邻域,适合高质量放大)。
-
INTER_AREA:像素区域重采样(下采样专用首选,抗锯齿效果最好)。
金字塔采样接口:cv2.pyrDown() 与 cv2.pyrUp()
这是专为构建图像金字塔(Image Pyramid)设计的标准 2 倍上下采样函数,常用于多尺度目标检测和图像缝合。
# 1. pyrDown (下采样 2 倍):
# 原理:先用 5×5 高斯核对原图进行平滑滤波,然后直接丢弃所有偶数行和偶数列
lower_res = cv2.pyrDown(img) # 宽高各变为 1/2
# 2. pyrUp (上采样 2 倍):
# 原理:在每行每列之间插入零值像素,然后用高斯核进行卷积平滑(填充缺失的颜色)
higher_res = cv2.pyrUp(img) # 宽高各变为 2 倍
注意: 先 pyrDown 再 pyrUp,图像尺寸虽然恢复了,但丢失的高频细节(模糊感)是无法通过普通高斯插值恢复回来的。
AI 深度学习超采样:cv2.dnn_superres
如果你想要像 DLSS / FSR 那样,把一张模糊的小图用 AI 补全细节放大(超分辨率重建),OpenCV 的 dnn_superres 模块提供了基于深度神经网络的超采样实现。
import cv2
from cv2 import dnn_superres
# 创建超分辨率对象
sr = dnn_superres.DnnSuperResImpl_create()
# 读取预训练的 AI 模型(如 ESPCN, EDSR, FSRCNN 等)
path = "ESPCN_x4.pb"
sr.readModel(path)
sr.setModel("espcn", 4) # 设置算法和放大倍数 (4倍)
# 进行 AI 超采样重建
result = sr.upsample(img)
这种 AI 上采样不会像传统插值那样简单地模糊平滑边缘,而是能“预测”出符合自然纹理的细节(如发丝、建筑墙面纹理)。
OpenCV 的 AI 超分辨率功能:
- 前置条件:使用 OpenCV 的超分辨率模块(dnn_superres),需要安装扩展版的 OpenCV 包: pip install opencv-contrib-python
-
自动建图与模型获取: 代码使用轻量级、速度极快的 ESPCN 算法模型(只有几百 KB)。首次运行时会自动下载权重文件;如果在同目录下没有找到 test_input.jpg,它会用 NumPy 现场绘制一张点阵图片。
-
算法配置关键三步:
-
cv2.dnn_superres.DnnSuperResImpl_create():实例化超分辨率推断引擎。
-
sr.readModel("ESPCN_x4.pb"):载入包含神经网络参数的文件。
-
sr.setModel("espcn", 4):注册模型类型与支持的放大倍数。
-
-
效果对比: 附件中的代码不仅生成了 AI 放大后的图片,还同步生成了一张使用传统 双三次插值(Bicubic) 放大的图片。仔细观察文字或物体线条边缘,你会发现 AI 输出的边缘更加平滑流畅、无明显锯齿感。
原始图像分辨率为100×100,经超分得到的图像为400×400,可见下图效果。
附1:如何查看某个opencv函数的具体用法?
方法一:Python 自带 help()(推荐)
例如想看 warpAffine:
import cv2
help(cv2.warpAffine)
更漂亮一点,Python 解释器里直接print,输出就是文档字符串。
import cv2
print(cv2.warpAffine.__doc__)
在虚拟环境中要加入python -c,如下图所示:
(.venv)E:\\Project\\LaMa> python -c "import cv2; help(cv2.imread)"
方法二:查看 OpenCV 官方文档(推荐)
图像处理模块(可看具体参数) — OpenCV 教程 – OpenCV 计算机视觉库
OpenCV 图像处理 (用法说明与操作示例)— OpenCV 教程 – OpenCV 计算机视觉库
方法三:查看源码示例(最值得学)
OpenCV 官方 GitHub:会看到很多官方 Demo,很多比教程还好。
GitHub – opencv/opencv: Open Source Computer Vision Library · GitHub
附2:Windows Photos应用调整图片大小的插值方法?
Windows Photos应用调整图片分辨率的插值方法-CSDN博客
参考来源:
OpenCV-Python 教程简介
图像处理模块(可看具体参数) — OpenCV 教程 – OpenCV 计算机视觉库
OpenCV 图像处理 (用法说明与操作示例)— OpenCV 教程 – OpenCV 计算机视觉库
tev:终极HDR图像查看器与专业对比工具指南-CSDN博客
Download Beyond Compare
网硕互联帮助中心


评论前必须登录!
注册