数字图像处理——实验一 Python中数字图像处理的基本操作
对于opecv-python做出基本介绍,且通过相关实验具体展示相关功能
数字图像处理——实验一 Python中数字图像处理的基本操作
一、实验目的
(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 分量和振幅都是有限且离散的量时,称该图像为数字图像。
在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 所示:
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 显示原始彩色图像:
打印原始图像的大小和类型:
(2)对原始彩色图像进行灰度化处理
cv2.cvtColor()
函数是 opencv-python 中的颜色空间转换函数,具体支持的转换类型如下表所示:
转换类型 | opencv-python 3.x 版本 |
---|---|
RGB<–>BGR | COLOR_BGR2BGRA, COLOR_RGB2BGRA, COLOR_BGRA2RGBA, COLOR_BGRA2BGR |
RGB<–>GRAY | COLOR_RGB2GRAY, COLOR_GRAY2RGB, COLOR_RGBA2GRAY, COLOR_GRAY2GRBA |
RGB<–>HSV | COLOR_BGR2HSV, COLOR_RGB2HSV, COLOR_HSV2BGR, COLOR_HSV2RGB |
RGB<–>YCrCb | COLOR_RGB2YCrCb, COLOR_BGR2YCrCb, COLOR_YCrCb2RGB, COLOR_YCrCb2BGR |
RGB<–>CIE XYZ | COLOR_BGR2XYZ, COLOR_RGB2XYZ, COLOR_XYZ2BGR, COLOR_XYZ2RGB |
RGB<–>HLS | COLOR_BGR2HLS, COLOR_RGB2HLS, COLOR_HLS2BGR, COLOR_HLS2RGB |
RGB<–>CIE L*a*b | COLOR_BGR2Lab, COLOR_RGB2Lab, COLOR_Lab2BGR, COLOR_Lab2RGB |
RGB<–>CIE L*a*b | COLOR_BGR2Luv, COLOR_RGB2Luv, COLOR_Luv2BGR, COLOR_Luv2RGB |
Bay–>RGB | COLOR_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()
对原始彩色图像进行灰度化处理后的图像:
(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()
对灰度图像二值化处理后的图像:
(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倍后的图像:
附录:整体代码
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)
更多推荐
所有评论(0)