1. 读取图片转换为数组,输出维度,类型,某个坐标的像素,图像等。
# -*- coding: utf-8 -*
from PIL import Image
from pylab import *
from numpy import *
#读取图片并转为数组
im = array(Image.open("example.jpg"))
#输出数组的各维度长度以及类型
print (im.shape,im.dtype)
#输出位于坐标100,100,颜色通道为r的像素值
print (im[100,100,0])
#输出坐标100,100的rgb值
print (im[100,100])
#print (im.shape,im.dtype)
r=im[:,:,0]
im[:,:,0]=im[:,:,2]
im[:,:,2]=r
imshow(im)
show()
2. 将minist手写数据集照片转化为0,1,并存到txt文件中
# -*- coding: utf-8 -*
from PIL import Image
from pylab import *
from numpy import *
im=Image.open('TestImage_1.bmp')
mtr=array(im)
mtr=(mtr>128)*1
print (mtr)
savetxt('num7.txt',mtr,fmt='%d')
3. 对图像进行反相处理,平方等等
from PIL import Image
from pylab import *
#读取图片,灰度化,并转为数组
im = array(Image.open("example.jpg").convert('L'))
im2 = 255 - im # 对图像进行反相处理
im3 = (100.0/255) * im + 100 # 将图像像素值变换到 100...200 区间
im4 = 255.0 * (im/255.0)**2 # 对图像像素值求平方后得到的图像(二次函数变换,使较暗的像素值变得更小)
#2x2显示结果 使用第一个显示原灰度图
subplot(221)
title('f(x) = x')
gray()
imshow(im)
#2x2显示结果 使用第二个显示反相图
subplot(222)
title('f(x) = 255 - x')
gray()
imshow(im2)
#2x2显示结果 使用第三个显示100-200图
subplot(223)
title('f(x) = (100/255)*x + 100')
gray()
imshow(im3)
#2x2显示结果 使用第四个显示二次函数变换图
subplot(224)
title('f(x) =255 *(x/255)^2')
gray()
imshow(im4)
#输出图中的最大和最小像素值
print (int(im.min()),int(im.max()))
print (int(im2.min()),int(im2.max()))
print (int(im3.min()),int(im3.max()))
print (int(im4.min()),int(im4.max()))
show()
4. 绘制图像
from PIL import Image
from pylab import *
im = array(Image.open('example.jpg').convert('L'))
# 绘制图像
gray()
imshow(im)
x=[10,10,40,40]
y=[20,50,20,50]
plot(x,y,'r*')
plot(x[:2],y[:2])
title('Plotting: "example.jpg"')
#axis('off')
show()
#plot(x,y) # 默认为蓝色实线
#plot(x,y,'r*') # 红色星状标记
#plot(x,y,'go-') # 带有圆圈标记的绿线
#plot(x,y,'ks:') # 带有正方形标记的黑色点线
5. 返回目录中所有JPG 图像的文件名列表,直方图均衡化,平均图像,主成分分析等
# -*- coding: utf-8 -*
import os
from numpy import *
from PIL import Image
from pylab import *
def get_imlist(path):
""" 返回目录中所有JPG 图像的文件名列表"""
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]
def imresize(im,sz):
""" 使用PIL 对象重新定义图像数组的大小"""
pil_im = Image.fromarray(uint8(im))
return array(pil_im.resize(sz))
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
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)
# 返回uint8 类型的平均图像
return array(averageim, 'uint8')
def pca(X):
""" 主成分分析:
输入:矩阵X ,其中该矩阵中存储训练数据,每一行为一条训练数据
返回:投影矩阵(按照维度的重要性排序)、方差和均值"""
# 获取维数
num_data,dim = X.shape
# 数据中心化
mean_X = X.mean(axis=0)
X = X - mean_X
if dim>num_data:
# PCA- 使用紧致技巧
M = dot(X,X.T) # 协方差矩阵
e,EV = linalg.eigh(M) # 特征值和特征向量
tmp = dot(X.T,EV).T # 这就是紧致技巧
V = tmp[::-1] # 由于最后的特征向量是我们所需要的,所以需要将其逆转
S = sqrt(e)[::-1] # 由于特征值是按照递增顺序排列的,所以需要将其逆转
for i in range(V.shape[1]):
V[:,i] /= S
else:
# PCA- 使用SVD 方法
U,S,V = linalg.svd(X)
V = V[:num_data] # 仅仅返回前nun_data 维的数据才合理
# 返回投影矩阵、方差和均值
return V,S,mean_X