Python针对图像的基础操作

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闪电gogogo的专栏

《统计学习方法》笔记二 感知机

感知机(perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,取±1。感知机对应与输入空间中将实例划分为正负两类的分离超平面,属...

8420
来自专栏iOSDevLog

决策树

12040
来自专栏机器学习养成记

特征工程(一):前向逐步回归(R语言)

“ 建模过程中,选择合适的特征集合,可以帮助控制模型复杂度,防止过拟合等问题。为了选取最佳的特征集合,可以遍历所有的列组合,找出效果最佳的集合,但这样需要大量的...

421110
来自专栏机器之心

教程 | 基础入门:深度学习矩阵运算的概念和代码实现

选自Medium 机器之心编译 参与:蒋思源 本文从向量的概念与运算扩展到矩阵运算的概念与代码实现,对机器学习或者是深度学习的入门者提供最基础,也是最实用的教...

454130
来自专栏张俊红

Sklearn参数详解—GBDT

这篇介绍Boosting的第二个模型GBDT,GBDT和Adaboost都是Boosting模型的一种,但是略有不同,主要有以下两点不同:

20840
来自专栏数值分析与有限元编程

可视化 | MATLAB划分均匀矩形网格

之前发过一个划分均匀三角形网格的例子。下面结合一个悬臂梁说说如何在规则区域划分均匀矩形网格。 ? 将一个矩形平面区域划分成相同大小的矩形。X方向等分nex,Y方...

57690
来自专栏机器学习养成记

Twitter情感分析CNN+word2vec(翻译)

Rickest Ricky 对Twitter内容做了一系列的文本分析处理,并把内容整理成博文发布到:https://medium.com/@rickykim78...

27510
来自专栏老秦求学

[Deep-Learning-with-Python]基于Kears的Reuters新闻分类

构建神经网络将路透社新闻分类,一共有46个类别。因为有多个类别,属于多分类问题,而每条数据只属于一个类别,所以是单标签多分类问题;如果每条数据可以被分到多个类别...

16030
来自专栏数据星河

人工智能之机器学习CART算法解析

  人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类。今天我们重点探讨一下CART算法。

14400
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

基于模糊集理论的一种图像二值化算法的原理、实现效果及代码

  这是篇很古老的论文中的算法,发表与1994年,是清华大学黄良凯(Liang-kai Huang) 所写,因此国外一些论文里和代码里称之为Huang's fu...

312110

扫码关注云+社区

领取腾讯云代金券