python完成数字图像处理小练习

2019-04-15 14:05发布

之前简单学习了python后着迷于anaconda里各种完善丰富的包和jupyter notebook这种友好的ide。正好有一份数字图像处理的小练习,若从零开始用matlab实在折腾,决定用python做。po上解决过程中一些小小问题和解决方案。1.绘制图像直方图codefrom PIL import Image import numpy as np import matplotlib.pyplot as plt img=np.array(Image.open('d:/pic/lena.jpg').convert('L')) //要注意python本来打开图像是RGB格式,需要转换 plt.figure("lena") arr=img.flatten() n, bins, patches = plt.hist(arr, bins=256, normed=1, alpha=0.75) //三个返回值都有对应作用! plt.show()返回值 :n: 直方图向量,是否归一化由参数 normed 设定bins: 返回各个bin的区间范围patches: 返回每个bin里面包含的数据,是一个listplt.hist()中参数: 必给arr, bins最好设为256或1以表明灰度区间,其他自行选择
2.python不同方式读取图像的差异
3.用skimage库显示图片一定有三步!附scikit-image官方文档
4.习惯使用Vimium后,如果快捷键和页面中更重要的快捷键冲突,比如 b:打开being搜索与notebook的b:insert a cell below冲突,x:关闭某个页面与notebook的x:删除当前cell冲突;可以通过exclude来禁用vimium的某些设定~

5.直方图均衡在现成模块 exposure中有函数,可直接使用(还是要自己试下原理)
处理前后直方图对比
6.偶然发现两个imshow()显示的图像大小不同,暂未找到原因
7.一开始通过Image模块读取图像进行直方图均衡发现图像失真,因为在np.array()中将图像convert成了灰度图像。PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:L = R * 299/1000 + G * 587/1000+ B * 114/1000
img2_1= np.array(Image.open('2-1.png').convert('L')) hist2_1,bins=np.histogram(img1.flatten(),range(256)) new2_1 = ex.equalize_hist(img2_1) plt.imshow(img2_1,cmap='gray') plt.show() plt.imshow(new2_1,cmap='gray') plt.show() #处理彩 {MOD}图像时发现加了convert(‘L’)会失真
8.了解图像一些基本的特征img=img2_1 print(type(img)) #显示类型 print(img.shape) #显示尺寸 print(img.shape[0]) #图片宽度 print(img.shape[1]) #图片高度 print(img.shape[2]) #图片通道数 print(img.size) #显示总像素个数 print(img.max()) #最大像素值 print(img.min()) #最小像素值 print(img.mean()) #像素平均值最后,图像增强部分到目前还是不太理解频率域的滤波,但是总体而言对DIP的框架已经搭起来了。目标是课程最后自己可以完成图像(目标)识别。