文章目录
- 环境配置说明
- 一、PIL-Python图像库
- 1.1 读入图片并转化为灰度图
- 1.2对图片进行格式转换
- 1.3创建缩略图、拷贝并粘贴区域、 调整尺寸及旋转
- 二、Matplotlib库
- 2.1 画图、描点和线
- 2.2 图像轮廓和直方图
- 2.3 交互
- 三、NumPy库
- 3.1 图像数组表示
- 3.2 灰度变换
- 3.3 直方图均衡化
- 3.4 图像平均
- 四、SciPy模块
- 4.1 图像模糊(高斯模糊)
- 4.2图像差分
- 4.3高斯差分
- 五、图像降噪
- 5.1 图像降噪
- 六、总结
环境配置说明
Anaconda2(python2.7)+pycharm2019.2.4
pycharm是python开发的高效工具,python当前发行版本包括了python2以及python3,选择pycharm可为当前项目选择不同的python环境。而Anaconda2自身包含了许多第三方库,比起直接安装python2.7(需要手动导入大量需要用到的第三方库),选择Anaconda2中的pyhthon2.7更为方便。
另由于先前我已安装Anaconda3自带python3,再安装Anaconda2,经网上查阅研究,最好是在Anaconda3中建立Anaconda2的虚拟环境,这样比起Anaconda3与Anaconda2分别独立安装(由于两个环境中,python版本不同,但pyhthon.exe是同名的,易引起使用时版本混乱),可更好切换当前使用的python版本。
一、PIL-Python图像库
1.1 读入图片并转化为灰度图
代码及结果:
分析:
- Image.open(‘图片路径’) 打开指定路径图片并返回一个image对象
- Image.open(‘图片路径’).convert(‘L’) 将图像转为灰度图
1.2对图片进行格式转换
代码及结果:
分析:
- from PCV.tools.imtools import get_imlist 载入PCV模块
- get_imlist(‘图片路径’) 获取文件夹下图片文件名
- file(‘文件路径’,‘w’) 将获取的图片写入指定文件中
1.3创建缩略图、拷贝并粘贴区域、 调整尺寸及旋转
代码及结果:
# 创建缩略图
pil_im = Image.open('data/561.jpg')
size = 128, 128
pil_im.thumbnail(size)
print pil_im.size
subplot(234)
title(u'缩略图', fontproperties=font)
axis('off')
imshow(pil_im)
pil_im.save('images/thumbnail.jpg') #保存缩略图
#拷贝并粘贴区域
pil_im = Image.open('data/561.jpg')
box = (100,100,300,300)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
subplot(233)
title(u'拷贝粘贴区域', fontproperties=font)
axis('off')
imshow(pil_im)
# 调整图像尺寸
pil_im = Image.open('data/561.jpg')
pil_im = pil_im.resize(size)
print pil_im.size
subplot(235)
title(u'调整尺寸后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
# 旋转图像45°
pil_im = Image.open('data/561.jpg')
pil_im = pil_im.rotate(45)
subplot(236)
title(u'旋转45°后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
分析:
- crop(box) 裁剪box大小的矩形区域,box是一个有四个数字的元组(裁剪区域左上角x坐标,裁剪区域左上角y坐标,裁剪区域右下角x坐标,裁剪区域右下角y坐标),裁剪区域最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴。
- region = region.transpose(Image.ROTATE_180) 将图片逆时针旋转180度
Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
Image.ROTATE_90,表示将图像逆时针旋转90°
Image.ROTATE_180,表示将图像逆时针旋转180°
Image.ROTATE_270,表示将图像逆时针旋转270°
Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
Image.TRANSVERSE,表示将图像进行转置,再水平翻转
- pil_im.paste(region,box) 将region图像粘贴到pil_im图像box区域的位置
- thumbnail(size) 创建一个指定的size大小的缩略图
- resize(size) 调整图像为指定size的尺寸
- rotate(45) 将图像旋转45度
二、Matplotlib库
2.1 画图、描点和线
代码及结果:
分析:
- plot(x, y, ‘r*’) 绘制x,y坐标对应的点
- plot(x[:2],y[:2]) 绘制连接前两个点的线
- axis() 显示坐标轴
2.2 图像轮廓和直方图
代码及结果:
分析:
- contour()函数 画出图像等高线
- hist()函数 画出图像直方图,hist() 只接受一维数组作为输入 ,用flatten() 方法将任意数组按照行优先准则转换成一维数组。
- 直方图对图像像素的灰度级进行分类统计。可以利用图像直方图的细长峰值判断图像的主要信息集中在哪个灰度上,利用图像两峰之间的面积判断背景色在哪个灰度上,也可以用峰谷判断噪点所在的灰度。
2.3 交互
代码及结果:
分析:
- ginput(3) 取3个点
- 代码先读取图像,显示读取的图像,然后用ginput()交互注释,这里设置的交互注释数据点设置为3个,点击注释3个点后,控制台将会输出这3个点的坐标。
三、NumPy库
3.1 图像数组表示
代码及结果:
from PIL import Image
from pylab import *
im = array(Image.open('data/561.jpg'))
print im.shape, im.dtype
#imshow(im)
im = array(Image.open('data/561.jpg').convert('L'),'f')
print im.shape, im.dtype
分析:
每行的第一个元组表示图像数组的大小(行、列、颜色通道),后面的字符串表示数组元素的数据类型,图像通常被编码成无符号八位整数(uint8),第二行将图像转为float型。
im[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
im[:,i] = 100 # 将第 i 列的所有数值设为100
im[:100,:50].sum() # 计算前100 行、前 50 列所有数值的和
im[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
im[i].mean() # 第 i 行所有数值的平均值
im[:,-1] # 最后一列
im[-2,:] (or im[-2]) # 倒数第二行
3.2 灰度变换
代码及结果:
每幅图像的小像素值和最大像素值:
分析:
- print int(im.min()), int(im.max()) 查看图像中的最小和最大像素值
- im2 = 255 - im 对图像进行反向操作,也可用fromarray() 函数,如图1,呈现负片效果。
- im4 = 255.0 * (im/255.0)**2 对图像使用二次函数变换,使得较暗的像素值变得更小,因而图像变得更暗,如图3。
3.3 直方图均衡化
代码及结果:
分析:
- histeq() 直方图均衡化函数,函数返回直方图均衡化后的图像,以及用来做像素值映射的累积分布函数。
- 直方图均衡化的基本思想是,对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,使一定灰度范围内的像素数量大致相同,从而达到清晰的目的。
直方图均衡化的具体实现:
def histeq(im,nbr_bins=256):
# 计算图像的直方图
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum()
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf
3.4 图像平均
代码及结果:
分析:
- compute_average()函数 对图像相同位置的像素相加取平均
- 平均后3幅图像叠加在一幅图中。
四、SciPy模块
4.1 图像模糊(高斯模糊)
代码及结果:
分析:
- 由结果可知高斯标准差越大,图像越模糊。
- 高斯模糊原理:每一个像素都取周边像素的平均值。
- 高斯模糊就是使用高斯滤波器完成的,高斯模糊是低通滤波的一种,也就是滤波函数是低通高斯函数。
- 关于滤波(高通、低通、带通、带阻) 、模糊、去噪、平滑概念
(源自:https://www.zhihu.com/question/54918332/answer/142137732)
4.2图像差分
代码及结果:
分析:
- 利用sobel算子进行边缘检测,运算图像亮度函数的灰度之近似值。
- 图片结果可知,x,y不同方向的差分,图像的灰度不同。
4.3高斯差分
代码及结果:
分析:
- 高斯差分将一个原始灰度图像的模糊图像从另一幅灰度图像进行增强的算法,以降低模糊图像的模糊度。
- 结果中,由左到右,标准差增大,高斯导数滤波器处理后的图像越模糊。
五、图像降噪
5.1 图像降噪
代码及结果:
分析:
- rof.denoise()函数 实现降噪。
- 对比高斯模糊处理的图像,ROF降噪在除去噪声的同时能够保持边缘和图像结构。
六、总结
python做简单的图像处理,只需导入第三方库,引用相关函数,对图像进行直方图均衡化以调整图像的对比度,对图像进行高斯模糊,降噪等处理,能减少图像噪声以及降低细节层次。