一、实验目的

(1)熟悉及掌握在Python中能够处理哪些格式图像;

(2)熟练掌握在Python中如何用 opencv-python 读取图像;

(3)掌握如何利用Python来获取图像的大小、颜色、高度、宽度等相关信息;

(4)掌握如何在Python中用 opencv-python 按照指定要求存储一幅图像的方法;

(5)掌握图像间的转化。

二、实验主要仪器设备

(1)计算机;

(2)Python及PyCharm软件;

(3)典型的灰度、彩色图像文件。

  • 注:opencv-python 使用的是3.x 版本

三、实验原理

3.1 数字图像的表示和类别

一幅图像可以被定义为一个二维函数 f ( x , y ) f(x,y) f(x,y),其中 x x x y y y 是空间(平面)坐标, f f f 在任何坐标 ( x , y ) (x,y) (x,y) 处的振幅称为图像在该点的亮度。灰度是用来表示黑白图像亮度的一个术语,而彩色图像是由单个二维图像组合形成的。例如,在RGB彩色系统中,一幅彩色图像是由三幅独立的分量图像(红、绿、蓝)组成的。因此,许多为黑白图像处理开发的技术适用于彩色图像处理,方法是分别处理三副独立的分量图像即可。

要将这样的一幅图像转化为数字形式,就要求数字化坐标和振幅。将坐标值数字化成为取样;将振幅数字化成为量化。采样和量化的过程如 图1 所示。因此,当 f f f x x x y y y 分量和振幅都是有限且离散的量时,称该图像为数字图像。

在这里插入图片描述

图1. 图像的采样和量化

在Python中,一幅图像可能包含一个数据矩阵,也可能有一个颜色映射表矩阵。opencv-python 支持四种图像类型,其区别在于数据矩阵元素的不同含义。它们是:

亮度图像(Intensity images)
二值图像(Binary images)
索引图像(Indexed images)
RGB图像(RGB images)

(1) 亮度图像

也称灰度图像。一幅亮度图像是一个数据矩阵,其归一化的取值表示亮度。若亮度图像的像素都是uint8类或uint16类,则它们的整数值范围分别是[0,255]和[0,65536]。若图像是double类,则像素取值就是浮点数。规定双精度型归一化亮度图像的取值范围是[0,1]。

(2) 二值图像

二值图像是指在图像中,每个像素的灰度等级只有两种。即全黑或者全白,在Python中,一幅二值图像是一个取值只有0和255的numpy数组。

(3) 索引图像

索引颜色通常也称为映射颜色,在这种模式下,颜色都是预先定义的,并且可供选用的一组颜色也很有限,索引颜色的图像最多只能显示256种颜色。

一幅索引颜色图像在图像文件里定义,当打开该文件时,构成该图像具体颜色的索引值就被读入程序里,然后根据索引值找到最终的颜色。

(4) RGB图像

一幅RGB图像就是彩色像素的一个M×N×3数组,其中每一个彩色相似点都是在特定空间位置的彩色图像相对应的红、绿、蓝三个分量。按照惯例,形成一幅RGB彩色图像的三个图像常称为红、绿或蓝分量图像。

值得注意的是,在 opencv-python 中,加载图像通道的顺序是BGR。但是 matplotlib(Python的一个绘图库)以RGB模式显示图像。因此,如果使用 opencv-python 读取彩色图像,则 matplotlib 中将无法正确显示彩色图像。

3.2 opencv-python图像文件格式

opencv-python 支持处理以下几种图像文件格式:

(1) PCX(Windows Paintbrush)格式

  • 可处理1,4,8,16,24位等图像数据。文件内容包括:文件头(128字节),图像数据、扩展颜色映射表数据。

(2) BMP(Windows Bitmap)格式

  • 有1,4,8,24位非压缩图像,8位RLE(Run-length Encoded)图像。文件内容包括:文件头(一个BITMAP FILEHEADER数据结构),位图信息数据块(位图信息头BITMAP INFOHEADER和一个颜色表)和图像数据。

(3) HDF(Hierarchical Data Format)格式

  • 有8位,24位光栅数据集。

(4) JPEG(Joint Photographic Experts Group)格式

  • 是一种成为联合图像专家组的图像压缩格式。

(5) TIFF(Tagged Image File Format)格式

  • 处理1,4,8,24位非压缩图像,1,4,8,24位packbit压缩图像,一位CCITT压缩图像等。文件内容包括:文件头,参数指针表与参数域,参数数据表和图像数据四部分。

(6) XWD(X Windows Dump)格式

  • 1,8位Zpixmaps、XYbitmaps;1位XYpixmaps。

(7) PNG(Portable Network Graphics)格式

四、实验内容及代码

4.1 实验内容

(1)利用 opencv-python 读取一幅彩色图像,并读取图像的基本信息;

(2)利用 opencv-python 显示图像;

(3)对彩色图像进行灰度化处理;

(4)对灰度图像进行二值化处理;

(5)对图像进行几何变换(缩放,平移,翻转);

(6)储存处理后的图像。

4.2 实验数据

本实验有且仅用到一张图片,原始图片如 图2 所示:

在这里插入图片描述

图2. 原始图像

4.3 实验代码

(1)读取以及显示原始彩色图像

cv2.imread() 函数为 opencv-python 包的读取图片的函数,该函数的变量列表如下:

cv2.imread(filename, flags=None)

第一个参数 filename 是图片路径,第二个参数 flags 表示图片读取模式,共有三种

flags效果
cv2.IMREAD_COLOR加载彩色图片,这个是默认参数,可以直接写1
cv2.IMREAD_GRAYSCALE以灰度模式加载图片,可以直接写0
cv2.IMREAD_UNCHANGED包括alpha(包括透明度通道),可以直接写-1

实现代码:

import cv2  # 引入OpenCV库

img = cv2.imread(r'./data/1.jpg')   # 使用 imread 函数读取图像,并以 numpy 数组形式储存
print("Pic_Size:", img.shape)       # 查看图像的大小。返回的元组(touple)中的三个数依次表示高度、宽度和通道数
print("Pic_Type:", img.dtype)       # 查看图片的类型
cv2.imshow('img', img)              # 使用imshow函数显示图像,第一个参数是窗口名称(可不写),第二个参数是要显示的图像变量的名称
cv2.waitKey(0)                      # 可以让窗口一直显示图像直到按下任意按键
cv2.destroyAllWindows()

通过 opencv-python 显示原始彩色图像:

在这里插入图片描述

图3. 通过opencv-python显示原始彩色图像

打印原始图像的大小和类型:

在这里插入图片描述

图4. 原始图像的大小和类型打印

(2)对原始彩色图像进行灰度化处理

cv2.cvtColor()函数是 opencv-python 中的颜色空间转换函数,具体支持的转换类型如下表所示:

转换类型opencv-python 3.x 版本
RGB<–>BGRCOLOR_BGR2BGRA, COLOR_RGB2BGRA, COLOR_BGRA2RGBA, COLOR_BGRA2BGR
RGB<–>GRAYCOLOR_RGB2GRAY, COLOR_GRAY2RGB, COLOR_RGBA2GRAY, COLOR_GRAY2GRBA
RGB<–>HSVCOLOR_BGR2HSV, COLOR_RGB2HSV, COLOR_HSV2BGR, COLOR_HSV2RGB
RGB<–>YCrCbCOLOR_RGB2YCrCb, COLOR_BGR2YCrCb, COLOR_YCrCb2RGB, COLOR_YCrCb2BGR
RGB<–>CIE XYZCOLOR_BGR2XYZ, COLOR_RGB2XYZ, COLOR_XYZ2BGR, COLOR_XYZ2RGB
RGB<–>HLSCOLOR_BGR2HLS, COLOR_RGB2HLS, COLOR_HLS2BGR, COLOR_HLS2RGB
RGB<–>CIE L*a*bCOLOR_BGR2Lab, COLOR_RGB2Lab, COLOR_Lab2BGR, COLOR_Lab2RGB
RGB<–>CIE L*a*bCOLOR_BGR2Luv, COLOR_RGB2Luv, COLOR_Luv2BGR, COLOR_Luv2RGB
Bay–>RGBCOLOR_BayerBG2BGR, COLOR_BayerGB2BGR, COLOR_BayerRG2BGR, COLOR_BayerGR2BGR, COLOR_BayerBG2RGB, COLOR_BayerGB2RGB, COLOR_BayerRG2RGB, COLOR_BayerGR2RGB

实现代码:

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 使用 cv2.cvtColor 函数转换色彩空间,从BGR空间转换到灰度空间
cv2.imshow('img_gray', img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

对原始彩色图像进行灰度化处理后的图像:

在这里插入图片描述

图5. 对原始彩色图像进行灰度化处理后的图像

(3)对灰度图像进行二值化处理

cv2.threshold() 函数的参数可参考:图像阈值处理cv2.threshold()函数(python))

实现代码:

ret, img_binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)  # 使用cv2.threshold进行阈值处理,127是阈值
cv2.imshow('img_binary', img_binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

对灰度图像二值化处理后的图像:

在这里插入图片描述

图6. 对灰度图像二值化处理后的图像

(4)对图像进行几何变换(缩放,平移,翻转)

cv2.resize()函数可将原始图像进行相应的变换,具体介绍可参考:cv2.resize()_青春须早为,岂能长少年的博客-CSDN博客_cv2.resize

实现代码:

img_2x = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)   # 使用cv2.resize函数进行缩放
cv2.imshow('img_2x', img_2x)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(r'./data/img_2x.jpg', img_2x)

对原始彩色图像放大2倍后的图像:

在这里插入图片描述

图7. 对原始彩色图像放大2倍后的图像

附录:整体代码

import cv2  # 引入OpenCV库

img = cv2.imread(r'./data/1.jpg')   # 使用 imread 函数读取图像,并以 numpy 数组形式储存
print("Pic_Size:", img.shape)       # 查看图像的大小。返回的元组(touple)中的三个数依次表示高度、宽度和通道数
print("Pic_Type:", img.dtype)       # 查看图片的类型
cv2.imshow('img', img)              # 使用imshow函数显示图像,第一个参数是窗口名称(可不写),第二个参数是要显示的图像变量的名称
cv2.waitKey(0)                      # 可以让窗口一直显示图像直到按下任意按键
cv2.destroyAllWindows()

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 使用 cv2.cvtColor 函数转换色彩空间,从RGB空间转换到灰度空间
cv2.imshow('img_gray', img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

ret, img_binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)  # 使用cv2.threshold进行阈值处理,127是阈值
cv2.imshow('img_binary', img_binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

img_2x = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)   # 使用cv2.resize函数进行缩放
cv2.imshow('img_2x', img_2x)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(r'./data/img_2x.jpg', img_2x)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐