python-Numpy科学计算工具包,pickle模块

正如标题所言,Numpy是用于科学计算的,其中数组对象对图像处理意义重大,还有线性代数函数等。在后面的所有机器学习中对图像的处理,都是基于这个库的,介绍几个简单的实例。

图像数组表示

调用array()方法:

im=array(Iamge.open('xxx.jpg'))

im=array(Iamge.open('xxx.jpg').convert('L'),'f')

注意:假设这是一张彩色图像,第一次打开的是彩色图像,数组中会存储三个信息。如(400,300,3)表示(行,列,颜色通道),后面还会有uint8 表示数组元素的数据类型,无符号八位整数。第二行表示的是进行灰度转换,此时就是灰度图像,没有颜色信息,(400,300),float32,因为 ’ f ‘将数据类型转换为浮点型。
像素可以通过下标访问:

#k是通道数
value=im[i,j,k]

多数组可以使用数组切片访问 使用:

im[:,i]=100 #将第i列所有数值设为100
im[i].mean() #第i行平均值

灰度变换

对灰度图像进行数学操作已达到某种效果。

#反相处理
im2=255-im
#将像素值变换到100到200区间
im3=(100/255)*im+100

直方图均衡化

指的是将图像的灰度直方图变平,使得变换后的图像中每个灰度值的分布概率相等。它是一种很好的归一化方法,可以增强图像的对比度。
简单来说:直方图均衡化是将直方图中像素分布集中的区域进行拉伸,分布较少的区域进行压缩,这对背景和前景太亮或太暗的图像好处很多,当然拉伸需要一个拉伸函数来重新计算概率分布,这就需要累计分布函数(CDF)。
举个简单例子来说明:
例如一幅图像有8个灰度级,分别0到7,0级有560个像素值,占总的像素值概率为0.19,依次类推,8个灰度级概率之和为1,我们这样处理,0级:0.19*7=1.33,最近取整为1,因此0级的像素值全划为1,1级:0.19*7+1级概率 *7 最近取整,其他以此类推。当然最后一个一定会是7,这样就保证了不会增加新的级数。可以预见,当概率较小时,很容易被吞并。

当然,某些情况下均衡化并不一定是最好的方案,有时我们需要对某区间进行有目的的增强。此时我们需要直方图规定化,也叫直方图匹配。详情请移步这里


图像平均

图像平均是减少噪声的一种简单方式,思想是假设我们有一组大小相同的图像列表,我们将其简单相加然后除以图像数目。

def compute_average(imlist):
    averageim=array(Image.open(imlist[0],'f')
    for imname in imlist[1:]:
        try:
            averageim+=array(Image.open(imname))
        except:
            print imname+ '...skipped'
    averageim/=len(imlist)
    return array(averageim,'uint8')

该程序提供了异常处理,自动跳过不能打开的图像。


图像的主成分分析(PCA)

这是一个很常用的降维技巧,一副100×100的图像也有10000维,一兆像素有百万维,我们需要对其进行处理后再来使用,来降低算法的开销。请查询PCA

pickle模块

我们在机器学习或者其他应用中,可能需要对一些结果或者数据进行保存,pickle模块的作用就在这里,它会把你的python对象转换为字符串表示,这个过程叫封装,从字符串中重构该对象,称为拆封。

#保存均值和主成分数据
with open('xxx.pkl','wb') as f:
    pickle.dump(immean,f)
    pickle.dump(V,f)

#打开文件并载入
with open('xxx.pkl','rb') as f:
    immean =pickle.load(f)
    V=pickle.load(f)
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页