前提说明:
需要提前下载python并配置好环境,安装jupyter-lab环境,安装相关的绘图工具包。
jupyter-lab安装命令:
pip install numpymatplotlib-ihttp://pypi.douban.com/simple--trusted-host pypi.douban.com
pip install pandas scipy scikit-learn scikit-image-ihttp://pypi.douban.com/simple--trusted-host pypi.douban.com pipinstallopencv-python-ihttp://pypi.douban.com/simple --trusted-host pypi.douban.com
pipinstalljupyter-ihttp://pypi.douban.com/simple--trusted-host pypi.douban.com
pipinstalljupyterlab-ihttp://pypi.douban.com/simple --trusted-host pypi.douban.com
在程序目录上输入cmd进入命令行输入jupyter-lab命令启动Jupyter-Lab
基本使用方法在本平台或者bilibili都有相关教程
后续会添加有关实验部分的代码块(ps:代码敲一遍上手更快)
一、实验目的
(1)熟悉Python的编程运行环境及Python的基本语法;
(2)掌握应用OpenCV的基本图形图像处理函数;
(3)掌握应用Matplotlib的基本图形图像处理函数;
(4)掌握绘制简单图像的方法。
二、实验环境
(1)实验硬件环境
笔记本电脑Windows10操作系统
- 软件及工具包
开发环境是Python3,需要配置的数学运算库包括NumPy、Matplotlib、OpenCV,编辑器是jupyter notebook。
NumPy是 Python 语言的一个扩展程序库。其中提供了许多向量和矩阵操作,能轻松完成最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号处理和图像处理、常微分方程求解以及其他科学与工程中常用的计算,不仅方便易用而且效率更高。NumPy 是一个开源的Python科学计算基础库,是SciPy、Pandas等数据处理或科学计算库的基础。
Matplotlib是一个Python 的2D绘图库,Matplotlib也是Python中最常用的可视化工具之一,它的功能非常强大,可以通过调用函数轻松方便地绘制数据分析中常见的各种图像,比如折线图、条形图、柱状图、散点图、饼图等。
OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、 Windows 和 Mac Os 操作系统上。它轻量级而且高效,由一系列 C 函数和少量 C++ 构成,同时也提供了 python 接口,实现了图像处理和计算机视觉方面的很多通用算法。
三、实验内容
(1)使用OpenCV的函数读取、显示并保存图像;
(2)使用Matplotlib的函数读取、显示并保存图像;
(3)完善代码,按要求绘制图形,并统计绘制其直方图。
四、实验程序及运行结果
- 实验代码:
import numpy as np
import cv2 as cv
lenna = cv.imread(r"Lenna.png")#读取图像
type(lenna)
lenna.shape#查看图片大小
cv.namedWindow("Lena",cv.WINDOW_NORMAL)
cv.imshow("Lena",lenna)#显示图像
cv.waitKey(100000)
cv.destroyWindow("Lena")#图像显示窗口关闭
cv.imwrite("test_imwirte.png",lenna,(cv.IMWRITE_PNG_COMPRESSION,9))#将压缩后的图像写入文件夹
运行结果:
实验代码:
import cv2 as cv
import matplotlib.pyplot as plt
img_BGR = cv.imread("iris.jpg")#读取图片
img_RGB = cv.cvtColor(img_BGR,cv.COLOR_BGR2RGB)
plt.imshow(img_RGB)#显示图片
plt.show()
plt.savefig(fname="pic.png",figsize=[10,10])
plt.imshow(img_BGR)
plt.show()
运行结果:
实验代码:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
def creatBox():
box = np.zeros((100,180),np.uint8)+250
print(type(box))
shape = box.shape
for i in range(shape[0]):
for j in range(shape[1]):
if (i-50)**2+(j-50)**2<=50**2:#表示圆形区域
box[i,j]=0#灰度值为0 显示黑色
else:
box[i,j]=250#剩余区域显示白色
if j in range (80,180) and i in range(0,100):#表示正方形区域
box[i,j]=150#灰度值为150 显示为灰色
return box
image0=creatBox()
plt.imshow(image0,vmin=0,vmax=255,cmap=plt.cm.gray)
#统计各灰度值的像素个数
def histogram(image):
(row, col) = image.shape
hist = [0]*256
for i in range(row):
for j in range(col):
hist[image[i,j]] +=1#遍历图片中每一点的像素值并统计
return hist
image_hist0 = histogram(image0)
plt.bar(range(256),image_hist0)
运行结果:
五、实验分析(对实验中出现的现象及遇到的问题进行分析、讨论,并对实验提出自己的建议和改进措施。)
验证一中的问题及改进措施:
图片显示窗口与预计设想不同,没有如期出现,经过逐句分析代码发现,图片显示时间较小,将数值100改为100000。名为“Lena”的窗口显示在桌面底层,且窗口大小不可调,经查阅资料发现,将cv.WINDOW_AUTOSIZE语句更换为cv.WINDOW_NORMAL,即能调节窗口大小,便于显示。
验证二中的实验没有出现问题,如果不进行通道数处理,原本发红的lena会变得发蓝。这是因为cv2读取图片时,默认的顺序是BGR顺序,而matplotlib用的是RGB方式。也就是说,发红的lenna图片读入img后,第三个通道内的数据(也就是红色通道)的数值在plt.imshow的时候,被按照B的方式(也就是蓝色)的方式读了出来,因此图像会偏蓝。BGR和RBG中的三个通道数互换,会改变图片中的三通道颜色显示,个人认为使用Matplotlib库中的plt.show函数显示图像比较简单,不用提前写一个图片显示show函数,不足之处还是要提前进行通道数转换。
任务三中的补全函数,先逐句分析代码含义和目标图像,可以发现该段代码是实现使用三种不同的灰度值填充空矩阵,显示圆形和正方形,只要限定像素点的位置,令其等于不同的灰度值即可。绘制直方图即补全像素值统计函数,预计显示出三个柱形图像,其像素点值为0,150,250。
六、思考题
(1)Python语言与C语言在语法上的主要区别是什么?
- Python是一种基于解释器的,面向对象的解释型语言。解释器会逐行读取代码;首先将Python编译为字节码,然后由大型C程序解释。C是一种面向过程的编译型语言,完整的源代码将直接编译为机器代码,由CPU直接执行。
- Python不需要事先定义变量类型;C语言中需要事先定义变量类型,在运算过程中需要考虑,溢出,精度等问题。
- Python中通过缩进来表示语句体,在Python中每一条语句结尾后没有分号;C语言通过几来表示语句体,在C语言中每一条语句结尾后都需要由英文分号结尾,分号是C语言中唯的语句结束标志。
(2)分析比较OpenCV下标与NumPy下标有什么异同?
结论: OpenCV中(x,y)坐标与NumPy中是相反的。
使用 Numpy 数组代表的图像时,表示的是一个二维数组。用shape方法得到的数组属性为 (height,width,depth) ,矩阵中的行在图像坐标系中对应图像的高度,列对应图像的宽度。在OpenCV中使用数组代表图像时,(x,y)在这里的表示的含义是x是横轴,y是纵轴。
(3)如果想用Matplotlib正常显示彩色图像,需要使用哪种彩色模型?如果想用OpenCV正常显示彩色图像,需要使用哪种彩色模型?
彩色图像使用 Matplotlib是RGB模式,OpenCV加载时是BGR模式;Matplotlib正常显示彩色图像,需要使用RGB彩色模型;OpenCV正常显示彩色图像,需要将BGR转化成RGB后再显示。