之前简单学习了python后着迷于anaconda里各种完善丰富的包和jupyter notebook这种友好的ide。正好有一份数字图像处理的小练习,若从零开始用matlab实在折腾,决定用python做。po上解决过程中一些小小问题和解决方案。1.绘制图像直方图code
from 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/1000img2_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的框架已经搭起来了。目标是课程最后自己可以完成图像(目标)识别。