前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python针对图像的基础操作

Python针对图像的基础操作

作者头像
李智
发布2018-08-03 17:30:27
7220
发布2018-08-03 17:30:27
举报
文章被收录于专栏:李智的专栏李智的专栏

1. 读取图片转换为数组,输出维度,类型,某个坐标的像素,图像等。

代码语言:javascript
复制
# -*- 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文件中

代码语言:javascript
复制
# -*- 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. 对图像进行反相处理,平方等等

代码语言:javascript
复制
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. 绘制图像

代码语言:javascript
复制
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 图像的文件名列表,直方图均衡化,平均图像,主成分分析等

代码语言:javascript
复制
# -*- 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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年11月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档