OpenCV图像读写详解:参数设置、压缩算法与像素操作

一只小鹿
一只小鹿
发布时间:2026-10-15 | 2人浏览过
原创

本文详解OpenCV中cv2.imread与cv2.imwrite的使用,解析图像读取的四步流程。深入对比JPEG有损压缩与PNG无损压缩的参数设置(如IMWRITE_JPEG_QUALITY),展示不同压缩比下的画质变化。同时介绍像素概念、RGB/BGR格式差异及具体的像素读写代码实现,帮助开发者掌握图像底层处理技巧。

OpenCV图像读取与显示基础

1. 读取图片


cv2.imread(filename, flags)
  • - filename:指定要读取的文件名
  • - flags:设置读取标志,0表示以灰度模式读取,1表示以彩色模式读取

cv2.imshow(winname, mat)
  • - winname:指定显示窗口的名称
  • - mat:指向要展示的图像矩阵对象

cv2.waitKey(0):用于暂停程序执行,确保图像能够正常显示在窗口中


import cv2
img = cv2.imread("img.jpg", 1)
cv2.imshow('img', img)
cv2.waitKey(0)

OpenCV图像写入与压缩算法对比

2. 图片写入

读取图片的过程主要包含四个步骤:

1. 文件读取 2. 封装格式解析(如jpg、png等格式) 3. 数据解码 4. 数据加载

经过上述步骤读取到的即为图像的原始数据


cv2.imwrite(filename, img)
  • - filename:指定保存的文件名
  • - img:指定要写入的图像数据

import cv2
img = cv2.imread("img.jpg", 1)
cv2.imwrite('img1.jpg', img)

True

2.1 图像质量

1. jpg格式的文件是以牺牲图像质量为代价进行压缩的,属于有损压缩

cv2.IMWRITE_JPEG_QUALITY: 用于设置当前图片的质量,取值范围为0-100。不同的压缩比会对应不同的图片文件大小,下面我们通过实例来体验这一过程:


import cv2
img = cv2.imread("img.jpg", 1)
cv2.imwrite('imgTest.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 0])

True

原图像如下:

图片大小为400kb

压缩之后的图片为:

图片大小为40kb,同时出现了严重的马赛克现象


import cv2
img = cv2.imread("img.jpg", 1)
cv2.imwrite('imgTest2.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50])

True

压缩之后的图片为:

图片大小为200kb,马赛克现象没有那么严重

2. png格式的图片压缩属于无损压缩,并且可以设置透明度


import cv2
img = cv2.imread("img.jpg", 1)
cv2.imwrite('imgTest1.png', img)

True


import cv2
img = cv2.imread("img.jpg", 1)
cv2.imwrite('imgTest2.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 0])

True

压缩之后的图像为:

图片大小为:5.92MB


import cv2
img = cv2.imread("img.jpg", 1)
cv2.imwrite('imgTest3.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 50])

True

图像大小变为2.34MB

由此可知,jpg格式图片文件图像质量的数值越低,压缩比越高;png格式图片文件图像质量的数值越低,压缩比越低

图像像素原理与读写操作

3. 像素

像素:是指组成图像的基本小方格

RGB:每一种颜色都是由Red(红)、Green(绿)、Blue(蓝)三种颜色组合而成的

颜色深度:比如,8bit表示每种颜色的范围是0~255,所以总共有256^3种颜色

图像宽高:表示在水平方向和竖直方向的像素点个数

未压缩图片的计算方法: w * h * 颜色通道(3) * 8 bit / 8(B)

3.1 像素读取与写入

每一个像素点都有3个部分组成,一般情况下,图片存储的格式为RGB,但是OpenCV读取的图片为BGR格式

我们将图片的左上角的一列变为蓝色


import cv2
img = cv2.imread('img.jpg', 1)
(b, g, r) = img[100, 100] # 读取像素值
print(b, g, r)
#10,100 --- 110, 100
for i in range(1, 1000):
  img[10 + i][100] = (255, 0, 0)
cv2.imshow('imageBlue.png', img)
cv2.waitKey(0)

59 54 129

True

到此这篇关于OpenCV读取与写入图片的实现的文章就介绍到这了,更多相关OpenCV读取与写入图片内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表