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()
  1. 读取图像

    image =cv2.imread(image_path)

    cv2.imread函数从指定路径加载图像,并返回一个图像对象(image)。量化表的选择影响压缩率和图像质量,高频成分的系数通常被设为零,因为人眼对这些变化不太敏感。libtiff 等。例如,对于 JPEG 文件,它可能会调用 libjpeg 的解码函数。

  2. 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.1687R0.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.5R0.4187G0.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 CBC R CR CR)分量。OpenCV 默认使用 BGR 排列。例如,JPEG 文件以 FFD8开头,PNG 文件以 89504E47开头。

              3. 数据转换

              解码后的原始像素数据需要转换为 OpenCV 使用的内部数据结构,即 NumPy 数组。libpng、

              总结

              JPEG压缩技术利用人眼对亮度和色度的敏感度差异,通过RGB到YCBCR转换、

          • 存储到 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=07y=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是 OpenCV 库中的一个函数,用于从文件中读取图像并将其加载到内存中作为 NumPy 数组。
    在这里插入图片描述

    在这里插入图片描述

    2. 色度下采样

    为了进一步减少数据量,JPEG压缩通过色度下采样减少CB和CR分量的分辨率,而保留所有的亮度分量。通过量化,每个DCT系数被除以一个预定义的量化表中的值,并四舍五入为整数。

  • cv2.IMREAD_GRAYSCALE:读取灰度图像。

    OpenCV

    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,支持多种编程语言,包括 Python。

  • 霍夫曼编码:将DCT系数和零序列的符号进一步压缩为更短的位串,依据这些符号出现的频率分配不同长度的代码。