OpenCV安装与环境配置
要开始使用OpenCV进行图像处理,首先需要完成安装和环境配置。对于Python用户而言,最便捷的方式是通过pip安装。在命令行中执行 pip install opencv-python 即可安装主模块,若需要额外的优化模块(如非免费的SIFT算法),则可以安装 opencv-contrib-python。安装完成后,可以在Python环境中通过 import cv2 来验证是否成功。除了Python,OpenCV也支持C++、Java等语言,在相应平台(如Windows、Linux、macOS)上可能需要从源码编译,这个过程较为复杂,但能提供更好的定制性。对于初学者,强烈建议从Python开始,以便将精力集中在图像处理的核心概念上,而非环境调试。
图像读取、显示与保存
这是任何图像处理流程的第一步。OpenCV提供了简单直观的函数来完成这些基本操作。
读取图像
使用 cv2.imread() 函数读取图像。该函数需要传入图像文件的路径作为参数,并返回一个包含像素数据的NumPy数组。需要注意的是,OpenCV默认以BGR(蓝-绿-红)模式而非常见的RGB模式读取彩色图像。第二个参数是读取标志,例如 cv2.IMREAD_COLOR(默认,读取彩色图像)、cv2.IMREAD_GRAYSCALE(以灰度模式读取)或 cv2.IMREAD_UNCHANGED(读取图像的所有通道,包括Alpha通道)。
显示图像
使用 cv2.imshow() 函数在一个窗口中显示图像。该函数第一个参数是窗口的名称,第二个参数是待显示的图像数组。为了保持窗口的显示,通常需要配合 cv2.waitKey() 函数使用,该函数会等待键盘输入(参数为0表示无限等待),最后用 cv2.destroyAllWindows() 关闭所有窗口。
保存图像
使用 cv2.imwrite() 函数将处理后的图像保存到文件。第一个参数是保存的文件路径(包含扩展名,如.jpg, .png),第二个参数是图像数据。
图像的基本操作
掌握图像的基本操作是进行复杂处理的基础,这包括像素访问、区域选取、通道分离与合并等。
像素访问与修改
由于OpenCV图像本质上是NumPy数组,因此可以直接通过坐标索引访问和修改像素值。对于灰度图像,使用 pixel_value = img[y, x];对于彩色图像(BGR),使用 blue = img[y, x, 0], green = img[y, x, 1], red = img[y, x, 2]。同样,也可以通过赋值来修改像素值。
图像属性
常用的图像属性可以通过NumPy数组的属性获取:img.shape 返回图像的行数(高度)、列数(宽度)和通道数;img.dtype 返回图像的数据类型(通常是 uint8);img.size 返回图像的像素总数。
ROI(Region of Interest)操作
ROI是指图像中需要重点关注的区域。可以通过数组切片的方式轻松选取ROI,例如 roi = img[ y1:y2, x1:x2 ]。选取的ROI可以与原图像共享数据,修改ROI也会影响原图。这常用于在图像特定区域进行操作,如粘贴一个小的标志。
通道拆分与合并
使用 b, g, r = cv2.split(img) 可以将BGR图像的三个通道分离成三个独立的单通道图像。反过来,使用 img_merged = cv2.merge([b, g, r]) 可以将单通道图像合并成一个多通道图像。注意顺序通常是BGR。
图像的几何变换
几何变换改变了图像中像素的空间位置关系,常用于图像校正、缩放、旋转等场景。
缩放
使用 cv2.resize() 函数改变图像的尺寸。可以指定目标尺寸(宽,高),也可以使用缩放因子。重要的参数是插值方法,如 cv2.INTER_LINEAR(双线性插值,适合放大)、cv2.INTER_AREA(适合缩小)和 cv2.INTER_CUBIC(三次插值,质量更高但速度慢)。
平移
平移是将图像沿x轴和y轴移动。需要定义一个2x3的变换矩阵M,其中 M = [[1, 0, tx], [0, 1, ty]],tx和ty是偏移量。然后使用 cv2.warpAffine(img, M, (width, height)) 进行变换。
旋转
旋转需要指定旋转中心和旋转角度。OpenCV提供了 cv2.getRotationMatrix2D(center, angle, scale) 函数来方便地生成旋转矩阵,然后再用 cv2.warpAffine() 进行变换。
仿射变换与透视变换
仿射变换是线性变换(旋转、缩放、平移)与剪切的组合,能保持图像的“平直性”(直线变换后仍是直线)。需要三个点对来计算变换矩阵。透视变换则更通用,可以将图像投影到一个新的视平面,可用于校正倾斜拍摄的文档等,需要四个点对来计算变换矩阵,使用 cv2.getPerspectiveTransform() 和 cv2.warpPerspective()。
图像滤波与平滑
图像滤波是消除图像噪声、平滑图像或突出图像特征的重要手段。
均值滤波
这是最简单的线性滤波器,它用邻域像素的平均值代替中心像素的值。使用 cv2.blur() 或 cv2.boxFilter() 实现。内核越大,模糊效果越明显,但可能丢失更多细节。
高斯滤波
高斯滤波是最常用的滤波器之一。它对邻域像素进行加权平均,权重由高斯函数决定,离中心越近的像素权重越大。使用 cv2.GaussianBlur() 实现,需要指定内核的宽高(必须是奇数)和标准差。高斯滤波能更有效地抑制噪声,同时更好地保留边缘信息。
中值滤波
中值滤波是一种非线性滤波器,它用邻域像素的中值代替中心像素的值。使用 cv2.medianBlur() 实现。对于去除“椒盐噪声”特别有效,而且能在模糊的同时更好地保护边缘。
双边滤波
双边滤波是一种能保持边缘的平滑滤波器。它同时考虑空间邻近度和像素值相似度,在平滑区域时能避免边缘被模糊。使用 cv2.bilateralFilter() 实现,但计算速度相对较慢。
图像阈值化
阈值化是将灰度图像转换为二值图像(黑白图像)的简单而有效的方法,用于图像分割。
简单阈值化
使用 cv2.threshold() 函数。需要指定一个阈值,像素值大于阈值则被赋予一个新值(如白色),否则被赋予另一个值(如黑色)。常见的类型包括 cv2.THRESH_BINARY 和 cv2.THRESH_BINARY_INV。
自适应阈值化
当图像不同区域光照不均时,单一全局阈值效果不佳。自适应阈值化根据像素邻域块的像素值分布来确定该像素的阈值。使用 cv2.adaptiveThreshold() 实现,方法有 cv2.ADAPTIVE_THRESH_MEAN_C(邻域均值)和 cv2.ADAPTIVE_THRESH_GAUSSIAN_C(邻域加权和,权重为高斯核)。
Otsu's二值化
Otsu算法能够自动根据图像直方图确定一个最佳全局阈值。它适用于双峰直方图的图像(前景和背景)。在 cv2.threshold() 中,将阈值设为0,并使用 cv2.THRESH_OTSU 标志,函数会返回计算出的最佳阈值。
396

被折叠的 条评论
为什么被折叠?



