OpenCV 默认使用 BGR 排列
发布时间:2025-06-24 19:37:40 作者:北方职教升学中心 阅读量:129
确保 NumPy 数组的 dtype 设置为 uint8
。scikit-image 等。量化、使用以下命令进行安装:
pip installopencv-python
实现代码
importcv2# 1. 读取图像image_path ='path/to/your/image.jpg'# 替换为你的图像文件路径image =cv2.imread(image_path)# 检查图像是否加载成功ifimage isNone:raiseFileNotFoundError(f"Image file '{image_path}' not found.")# 2. 显示原始图像cv2.imshow('Original Image',image)# 3. 将图像转换为灰度图像gray_image =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)# 4. 应用高斯模糊blurred_image =cv2.GaussianBlur(gray_image,(15,15),0)# 5. 显示处理后的图像cv2.imshow('Gray Image',gray_image)cv2.imshow('Blurred Image',blurred_image)# 6. 保存处理后的图像cv2.imwrite('gray_image.jpg',gray_image)cv2.imwrite('blurred_image.jpg',blurred_image)# 等待按键事件,然后关闭所有图像窗口cv2.waitKey(0)cv2.destroyAllWindows()
读取图像
image =cv2.imread(image_path)
cv2.imread
函数从指定路径加载图像,并返回一个图像对象(image
)。量化表的选择影响压缩率和图像质量,高频成分的系数通常被设为零,因为人眼对这些变化不太敏感。libtiff 等。例如,对于 JPEG 文件,它可能会调用 libjpeg 的解码函数。- flags: 指定图像的读取方式,常用的选项包括:
cv2.IMREAD_COLOR
:读取彩色图像,忽略 Alpha 通道。文章目录
- OpenCV
- `cv2.imread` 函数
- 函数参数
- 源码解析
- 1.文件读取
- 2. 解码图像数据
- 补充:JPEG的压缩原理
- 1. RGB到YCBCR颜色空间转换
- 2. 色度下采样
- 3. 离散余弦变换(DCT)
- 4. 量化
- 5. 运行长度编码和霍夫曼编码
- 6. 压缩数据的存储
- 总结
- 3. 数据转换
- 具体代码实现
- 实战案例:图像处理
- 目标
- 环境准备
- 实现代码
- 运行结果
- 扩展功能
- 扩展代码
在 Python 图像处理领域,有多个常用的库和 API,如 OpenCV、这涉及以下几个步骤:通道排列:
- 对于彩色图像,解码后的数据通常包含多个通道(如 RGB 或 BGR)。
cv2.IMREAD_UNCHANGED
:读取图像,包括 Alpha 通道。BMP 等),因此它会根据文件扩展名或文件头来识别图像格式。其实现原理涉及多个步骤:1.文件读取
cv2.imread
首先定位并打开指定路径的图像文件。量化后的DCT系数、显示原始图像
cv2.imshow('Original Image',image)
cv2.imshow
函数用于显示图像,第一个参数是窗口的名称,第二个参数是要显示的图像数据。DCT变换、物体识别、实战案例:图像处理
目标
这个案例的目标是读取一张图像,将其转换为灰度图像,应用高斯模糊来平滑图像,然后显示和保存处理后的图像。
显示处理后的图像
cv2.imshow('Gray Image',gray_image)cv2.imshow('Blurred Image',blurred_image)
显示灰度图像和模糊后的图像。它涉及识别图像格式并使用相应的解码库来解析图像数据。
cv2.imread
函数cv2.imread
是 OpenCV 中用于读取图像的函数。其基本用法如下:importcv2# 读取图像image =cv2.imread('path/to/image.jpg',cv2.IMREAD_COLOR)
函数参数
- filename: 图像文件的路径。
5. 运行长度编码和霍夫曼编码
量化后的DCT系数通过两种无损压缩技术进行编码:
- 运行长度编码(RLE):用于编码量化后的DCT系数中的零序列,从而减少数据量。以 JPEG 为例,解码过程包括逆量化、
解码过程:
- 解码库将图像文件中的压缩数据解码为原始像素数据。对于彩色图像,这是一个三维数组,其维度为 (高度, 宽度, 通道数)。
识别图像格式:
cv2.imread
根据文件扩展名或文件头信息来识别图像格式。
选择解码库:
- OpenCV 集成了多个图像解码库,如 libjpeg、
2. 解码图像数据
解码步骤是整个过程中最复杂的部分。
将图像分成8x8像素的块,并对每个块应用DCT。
RGB颜色空间直接表示红、
数据类型转换:
- 解码后的像素数据通常是 uint8 类型(每个像素值在 0 到 255 之间)。
保存处理后的图像
cv2.imwrite('gray_image.jpg',gray_image)cv2.imwrite('blurred_image.jpg',blurred_image)
cv2.imwrite
函数将处理后的图像保存到指定的文件路径。通过集成多个解码库,OpenCV 能够处理多种图像格式,并将解码后的数据转换为易于处理的 NumPy 数组。逆离散余弦变换 (IDCT) 等步骤,最终得到每个像素的颜色值。- OpenCV 支持多种图像格式(如 JPEG、
环境准备
安装OpenCV 库。人眼对亮度变化更敏感,对色度变化不太敏感,因此这种转换有助于后续的压缩。转换到YCBCR颜色空间的公式如下:
Y = 0.299 R + 0.587 G + 0.114 B Y = 0.299R + 0.587G + 0.114B Y=0.299R+0.587G+0.114B
C B = − 0.1687 R − 0.3313 G + 0.5 B + 128 CB = -0.1687R - 0.3313G + 0.5B + 128 CB=−0.1687R−0.3313G+0.5B+128
C R = 0.5 R − 0.4187 G − 0.0813 B + 128 CR = 0.5R - 0.4187G - 0.0813B + 128 CR=0.5R−0.4187G−0.0813B+128
这种转换使得亮度(Y)与色度(CB和CR)分离,便于后续处理。 将图像转换为灰度图像
gray_image =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.cvtColor
函数将图像从 BGR 颜色空间转换为灰度图像。这通常是通过将CB和CR分量的分辨率减少到原来的1/2或1/4来实现的。
具体代码实现
下面是一个简化的伪代码示例,展示了
cv2.imread
的解码和数据转换过程:defimread(filepath):# 1. 打开并读取文件withopen(filepath,'rb')asf:file_data =f.read()# 2. 识别图像格式iffile_data.startswith(b'\xff\xd8'):format='jpeg'eliffile_data.startswith(b'\x89PNG'):format='png'else:raiseValueError('Unsupported image format')# 3. 使用相应的解码库解码图像数据ifformat=='jpeg':image_data =decode_jpeg(file_data)elifformat=='png':image_data =decode_png(file_data)# 4. 将解码后的数据转换为 NumPy 数组height,width,channels =image_data.shape image_array =np.zeros((height,width,channels),dtype=np.uint8)image_array[:,:,:]=image_data returnimage_arraydefdecode_jpeg(data):# 使用 libjpeg 解码 JPEG 数据的伪代码returnlibjpeg.decode(data)defdecode_png(data):# 使用 libpng 解码 PNG 数据的伪代码returnlibpng.decode(data)
实际的
cv2.imread
实现更加复杂,包含更多的细节和错误处理,但上述步骤和逻辑展示了其基本原理。运动跟踪、- 解码库将图像文件中的压缩数据解码为原始像素数据。对于彩色图像,这是一个三维数组,其维度为 (高度, 宽度, 通道数)。
等待按键事件,关闭所有图像窗口
cv2.waitKey(0)cv2.destroyAllWindows()
cv2.waitKey(0)
等待用户按下任意键,然后cv2.destroyAllWindows()
关闭所有打开的图像窗口。Y C B C R YCBCR YCBCR颜色空间分为三个分量:亮度(Luma,Y Y Y)和两个色度(Chroma,C B CB CB和C R CR CR)分量。OpenCV 默认使用 BGR 排列。例如,JPEG 文件以FFD8
开头,PNG 文件以89504E47
开头。3. 数据转换
解码后的原始像素数据需要转换为 OpenCV 使用的内部数据结构,即 NumPy 数组。libpng、
总结
JPEG压缩技术利用人眼对亮度和色度的敏感度差异,通过RGB到YCBCR转换、
- filename: 图像文件的路径。
存储到 NumPy 数组:
- 将解码后的像素数据存储在一个 NumPy 数组中。
补充:JPEG的压缩原理
JPEG图像压缩技术通过一系列有损压缩步骤有效地减少图像文件大小,同时保持视觉质量。RLE和霍夫曼编码结果)一起存储为JPEG文件。
运行结果
运行上述代码后,你将看到三个窗口分别显示原始图像、
- 根据图像格式,
cv2.imread
会调用相应的解码库函数。机器学习等。OpenCV 是其中最广泛使用的一个库,功能强大,应用广泛。运行长度编码和霍夫曼编码等步骤,有效地减少图像文件大小,同时保持较高的视觉质量。 - 如果解码库输出的是 RGB 格式,则需要进行通道转换(从 RGB 到 BGR)。例如,4:2:0色度下采样表示每个CB和CR样本都覆盖2x2个亮度样本。OpenCV 提供了大量的图像和视频处理函数,广泛应用于各种计算机视觉任务,如图像处理、
扩展代码
添加了边缘检测和图像旋转的代码如下:
importcv2# 1. 读取图像image_path ='path/to/your/image.jpg'image =cv2.imread(image_path)ifimage isNone:raiseFileNotFoundError(f"Image file '{image_path}' not found.")# 2. 显示原始图像cv2.imshow('Original Image',image)# 3. 将图像转换为灰度图像gray_image =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)# 4. 应用高斯模糊blurred_image =cv2.GaussianBlur(gray_image,(15,15),0)# 5. 边缘检测edges =cv2.Canny(blurred_image,100,200)# 6. 图像旋转(h,w)=gray_image.shape[:2]center =(w //2,h //2)rotation_matrix =cv2.getRotationMatrix2D(center,45,1.0)# 旋转45度rotated_image =cv2.warpAffine(gray_image,rotation_matrix,(w,h))# 7. 显示处理后的图像cv2.imshow('Gray Image',gray_image)cv2.imshow('Blurred Image',blurred_image)cv2.imshow('Edges',edges)cv2.imshow('Rotated Image',rotated_image)# 8. 保存处理后的图像cv2.imwrite('gray_image.jpg',gray_image)cv2.imwrite('blurred_image.jpg',blurred_image)cv2.imwrite('edges.jpg',edges)cv2.imwrite('rotated_image.jpg',rotated_image)# 等待按键事件,然后关闭所有图像窗口cv2.waitKey(0)cv2.destroyAllWindows()
6. 压缩数据的存储
最后,压缩后的数据(包括色度下采样、此外,灰度图像和模糊后的图像将被保存到当前工作目录中。其主要技术原理和步骤如下:
1. RGB到YCBCR颜色空间转换
JPEG压缩首先将图像从RGB颜色空间转换为Y C B C R YCBCR YCBCR颜色空间。蓝三种颜色分量。色度下采样、
- 图像调整大小:使用
cv2.resize
函数改变图像的尺寸。 - 图像旋转:使用
cv2.warpAffine
函数对图像进行旋转变换。这些系数表示图像中的不同频率成分。另外,去掉50%的高频信息存储部分,图像信息量的损失不到5%。扩展功能
你可以在这个基础上添加更多的图像处理功能,例如:
- 图像边缘检测:使用
cv2.Canny
函数检测图像的边缘。
每个8x8块通过公式转换为DCT系数矩阵:
F ( u , v ) = 1 4 C ( u ) C ( v ) ∑ x = 0 7 ∑ y = 0 7 f ( x , y ) cos [ ( 2 x + 1 ) u π 16 ] cos [ ( 2 y + 1 ) v π 16 ] F(u,v) = \frac{1}{4}C(u)C(v) \sum_{x=0}^{7} \sum_{y=0}^{7} f(x,y) \cos\left[\frac{(2x+1)upi}{16}\right] \cos\left[\frac{(2y+1)vpi}{16}\right] F(u,v)=41C(u)C(v)∑x=07∑y=07f(x,y)cos[16(2x+1)uπ]cos[16(2y+1)vπ]4. 量化
DCT系数经过量化处理,这是JPEG压缩的主要有损步骤。这种技术广泛应用于图像和视频压缩。
应用高斯模糊
blurred_image =cv2.GaussianBlur(gray_image,(15,15),0)
cv2.GaussianBlur
函数对灰度图像应用高斯模糊,(15, 15)
是高斯内核的大小,0
是高斯函数的标准差。灰度图像和模糊后的图像。PNG、DCT将这些空间域的像素值转换为频域的DCT系数。绿、低频成分通常具有较大的系数,而高频成分的系数较小。Pillow、3. 离散余弦变换(DCT)
DCT变换对图像进行压缩的原理是减少图像中的高频分量,高频主要是对应图像中的细节信息,而我们人眼对细节信息并不是很敏感,因此可以去除高频的信息量。如果图像文件无法找到,将抛出
FileNotFoundError
异常。接下来,我将介绍 OpenCV,并解析一个最常用的 API,即cv2.imread
,它用于读取图像。
- 图像边缘检测:使用
cv2.IMREAD_GRAYSCALE
:读取灰度图像。OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,支持多种编程语言,包括 Python。
- 霍夫曼编码:将DCT系数和零序列的符号进一步压缩为更短的位串,依据这些符号出现的频率分配不同长度的代码。
源码解析
cv2.imread
是 OpenCV 库中的一个函数,用于从文件中读取图像并将其加载到内存中作为 NumPy 数组。
2. 色度下采样
为了进一步减少数据量,JPEG压缩通过色度下采样减少CB和CR分量的分辨率,而保留所有的亮度分量。通过量化,每个DCT系数被除以一个预定义的量化表中的值,并四舍五入为整数。