Python一些基本的图像操作和处理总结


Posted in Python onJune 23, 2021

一、Python图像处理PIL库

1.1 转换图像格式

# PIL(Python Imaging Library)
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']
# 读取的是图像,cv.imread读取的是array,Image.open()显示的图像是RGB
pil_im=Image.open('pic/kobe_mamba.jpg')

subplot(121),plt.title('原图'),axis('off')
imshow(pil_im)

pil_im_gray=pil_im.convert('L')
subplot(122),plt.title('灰度图'),xticks(x,()),yticks(y,())
imshow(pil_im_gray)

Python一些基本的图像操作和处理总结

# 转换图像格式 PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/apple.jpg')

# 模式1 二值图像

pil_im_binary=pil_im.convert('1')
subplot(231),plt.title('二值图像'),axis('off'),imshow(pil_im_binary)

pil_im_binary.getpixel((10,10))

# 模式2 L = R * 299/1000 + G * 587/1000+ B * 114/1000 灰度模式 0表示黑,255表示白

# 模式3 P模式为8位彩色图像,通过RGB调色

pil_im_p=pil_im.convert('P')

subplot(232),plt.title('调色P图像'),axis('off'),imshow(pil_im_p)

# 模式4 模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit(255)表示alpha通道,255表示不透明。

pil_im_RGBA=pil_im.convert('RGBA')

subplot(233),plt.title('RGBA图像'),axis('off'),imshow(pil_im_RGBA)

# 模式5 CMYK 三原色+黑色,每个像素由32位表示
# C = 255 - R, M = 255 - G, Y = 255 - B, K = 0

pil_im_CMYK=pil_im.convert('CMYK')

subplot(234),plt.title('CMYK图像'),axis('off'),imshow(pil_im_CMYK)

#模式6 YCbcr 24位bit表示 Y= 0.257*R+0.504*G+0.098*B+16 Cb = -0.148*R-0.291*G+0.439*B+128 Cr = 0.439*R-0.368*G-0.071*B+128

pil_im_YCbCr=pil_im.convert('YCbCr')

subplot(235),plt.title('YCbCr图像'),axis('off'),imshow(pil_im_YCbCr)

# 模式7 I模式略 与L模式显示相同 ,只不过是32bit

# 模式8 F模式略 像素保留小数,其余与L模式相同

Python一些基本的图像操作和处理总结

1.2 缩略图

# PIL(Python Imaging Library)
from PIL import Image
from pylab import *
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/kobe_mamba.jpg')


# 创建缩略图 且可以指定大小

pil_im.thumbnail((120,120))

plt.title('缩略图'),xticks(x,()),yticks([])
imshow(pil_im)

Python一些基本的图像操作和处理总结

1.3 复制、粘贴和旋转、调整尺寸

# 元组坐标分别为(左、上、右、下),从而标出了一块区域,相当于[100:400,100:400]

box=(100,100,400,400)

region=pil_im.crop(box)
# 旋转180度
region=region.transpose(Image.ROTATE_180)

figure(figsize=(5,5))

plt.title('复制区域'),axis('off')


imshow(region)
#粘贴


pil_im=Image.open('pic/kobe_mamba.jpg')

pil_im.paste(region,box)

figure(figsize=(5,5))

plt.title('粘贴后的图像'),axis('off')

imshow(pil_im)

# 调整尺寸和旋转 resize 和 rotate 函数

out=pil_im.resize((128,128))

out=pil_im.rotate(45)

Python一些基本的图像操作和处理总结

第二张图是box旋转了180度再粘贴的结果

二、Matoplotlib库基础学习

# 基本绘图
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
from pylab import *

x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
figure()
plt.plot(x,z)
plt.show()

两张绘图

Python一些基本的图像操作和处理总结


 
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
plt.plot(x,y)
plt.plot(x,z)

绘图叠加

Python一些基本的图像操作和处理总结

# 曲线颜色、标记、粗细
plot(x, y, color="blue", linewidth=1.0, linestyle=":")
plot(x,z,'--r',linewidth=2.0)

Python一些基本的图像操作和处理总结
Python一些基本的图像操作和处理总结

# 离散取值
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'bo',markersize=3)

Python一些基本的图像操作和处理总结

# 离散取值的属性及用虚线相连
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w')

Python一些基本的图像操作和处理总结

# 设置坐标轴的范围和记号
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
xlim(-4,4)
xticks(np.linspace(-4,4,10))
ylim(-1.0,1.0)
yticks(np.linspace(-1.0,1.0,5))
plt.plot(x,y,'--r')

Python一些基本的图像操作和处理总结

# 设置title与坐标轴的一些操作
# 设置中文
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()
# 设置title与坐标轴的一些操作
# 设置中文
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()

Python一些基本的图像操作和处理总结

#设置坐标轴的标签(多样化)
# xticks(locs, [labels], **kwargs)  # Set locations and labels **kwargs是关键字参数
import calendar

x = range(1,13,1)
y = range(1,13,1)
plt.plot(x,y)
# 标签手动设置('','','',...)亦可
plt.xticks(x, calendar.month_name[1:13],color='m',rotation=45,fontsize=12,fontname='Arial')
plt.show()

Python一些基本的图像操作和处理总结

# 设置图例
matplotlib.rcParams['axes.unicode_minus'] =False

plt.rcParams['font.sans-serif'] = ['SimHei']
a=np.arange(13)*pi/12
b=cos(3*a)
plt.plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w',label='cos的图像')
xlabel('横轴')
ylabel('纵轴')
plt.legend(loc='upper right')
plt.show()

Python一些基本的图像操作和处理总结

# 子图1
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
fig, (ax1 ,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
ax1.plot(x,y),ax2.plot(x,z)
ax1.set_title('cos'),ax2.set_title('sin')
plt.show()

Python一些基本的图像操作和处理总结

# 子图2
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
figure(figsize=(10,5),dpi=80)
subplot(121),plt.plot(x,y),plt.title('cos')
subplot(122),plt.plot(x,z),plt.title('sin')
plt.show()

Python一些基本的图像操作和处理总结

2.1 绘制实际图像中的点和线

# 使用matplotlib连线
from PIL import Image
from pylab import *

# 读取为列表,以便标记x、y的点?
im=array(Image.open('pic/kobe_mamba.jpg'))

imshow(im)

# 列表 包含四个点坐标
x=[100,100,400,400]
y=[200,500,200,500]

#红色叉型标出
plot(x,y,'rx')


# 连接坐标的前两个点的线 (100,200)与(100,500)
plot(x[:2],y[:2])

show()

Python一些基本的图像操作和处理总结

2.2 图像轮廓与直方图

# contour 与 hist
# 绘制轮廓要将图像先灰度化
from PIL import Image
from pylab import *

im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
figure()
# 
gray()
# 绘制轮廓,且起始位置从左上角开始
contour(im,origin='image')

# 坐标轴均匀分布
axis('equal')

# 新图像
figure()
hist(im.ravel(),256)

# hist的第二个参数指定小区间的个数,128个,即每个小区间灰度值跨度为2
figure()
hist(im.flatten(),128) 

show()

Python一些基本的图像操作和处理总结

三、Numpy库基本学习

import numpy as np

import math
a=np.array(((1,2,3),(4,5,6)),dtype=float/complex)
a

Python一些基本的图像操作和处理总结
Python一些基本的图像操作和处理总结

b=np.arange(15).reshape(3,5)
b
# 属性
b.shape
b.ndim
b.dtype
b.size
b.itemsize

Python一些基本的图像操作和处理总结

from numpy import pi
np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
c=np.random.random((2,3))

c.max/min()

Python一些基本的图像操作和处理总结

d=np.arange(12).reshape((3,4))
d.dtype.name
# 每个col的sum
print(d.sum(axis=0))
# 每行的累计和
print(d.cumsum(axis=1))

Python一些基本的图像操作和处理总结

# 转变数组类型
a=np.array(((1,2,3),(4,5,6)),'float32')
a=a.astype('int16')
a

Python一些基本的图像操作和处理总结

# 索引和切片
a = np.arange(10)**3 # 0~9的立方
a[2:5] #a[2-4]
# 令a[0,2,4]为-1000
a[:6:2] = -1000 
# reverse
a[ : :-1]

Python一些基本的图像操作和处理总结

a = np.arange(12).reshape((3,4))
a[0:3,1]
# 第2列
# or
a[:,1]
a[0:1,0:3]

Python一些基本的图像操作和处理总结

# 变换为1维数组
a = np.arange(12).reshape((3,4))
a.ravel()

Python一些基本的图像操作和处理总结

# 变换形状
a = np.arange(12).reshape((3,4))
a.resize((6,2))
a

Python一些基本的图像操作和处理总结

a = np.arange(12).reshape((3,4))
b=10*np.random.random((3,4))
# 竖着叠加
np.vstack((a,b))
# 横着叠加
np.hstack((a,b))

Python一些基本的图像操作和处理总结

x, y = np.ogrid[:3, :4]
# 同样可以设置步长
x, y = np.ogrid[0:3:1, 0:5:2]

# 询问,x>0的部分不变,其余赋值为2
np.where(x>0,x,2)

Python一些基本的图像操作和处理总结

3.1 直方图均衡化

# 解释累加函数
import numpy as np
a=[1,2,3,4,5,6,7]
cdf=np.cumsum(a)

cdf[-1]

cdf=7*cdf/cdf[-1]
cdf

28

Python一些基本的图像操作和处理总结

# 直方图均衡化
# bins 小区间的个数
def histeq(im,bins=256):
    #返回两个参数
    imhist,bins=histogram(im.flatten(),bins)
    # 累计分布函数,相当于cdf是一个列表
    cdf=imhist.cumsum()
    # cdf[-1]是列表的最后一个值,(0,255)
    cdf=255*cdf/cdf[-1]
    # 新的线性插值
    im2=interp(im.flatten(),bins[:-1],cdf)
    # 返回im2图像大小与im相同
    return im2.reshape(im.shape),cdf
# 直方图先转为灰度图
im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
im2,cdf=histeq(im,256)

figure()
imshow(im2)
figure()
hist(im2.flatten(),256)
show()

Python一些基本的图像操作和处理总结

3.2 图像缩放

#  转换为array
img = np.asarray(image)

# 转换为Image
Image.fromarray(np.uint8(img))

# 图像缩放函数

def imresize(im,sz):
    # 将数组转换为图像
    pil_im=Image.fromarray(np.uint8(im))
    # 图像转换为数组
    return np.array(pil_im.resize(sz))

imshow(imresize(Image.open('pic/kobe_mamba.jpg'),(128,128)))

Python一些基本的图像操作和处理总结

3.3 图像的主成分分析(PCA)

PCA(Principal Component Analysis,主成分分析)是一个非常有用的降维技巧。它可以在使用尽可能少维数的前提下,尽量多地保持训练数据的信息,在此意义上是一个最佳技巧。即使是一幅 100×100 像素的小灰度图像,也有 10 000 维,可以看成 10 000 维空间中的一个点。一兆像素的图像具有百万维。由于图像具有很高的维数,在许多计算机视觉应用中,我们经常使用降维操作。PCA 产生的投影矩阵可以被视为将原始坐标变换到现有的坐标系,坐标系中的各个坐标按照重要性递减排列。

为了对图像数据进行 PCA 变换,图像需要转换成一维向量表示。我们可以使用 NumPy 类库中的flatten() 方法进行变换。
将变平的图像堆积起来,我们可以得到一个矩阵,矩阵的一行表示一幅图像。在计算主方向之前,所有的行图像按照平均图像进行了中心化。我们通常使用 SVD(Singular Value Decomposition,奇异值分解)方法来计算主成分;但当矩阵的维数很大时,SVD 的计算非常慢,所以此时通常不使用 SVD 分解。

from PIL import Image
from numpy import *

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

四、Scipy

4.1 图像模糊

# 图像模糊
# Scipy 库
from PIL import Image
from numpy import *
from scipy.ndimage import filters

im=array(Image.open('pic/building.tif').convert('L'))
# filters.gaussian_filter第二个参数是标准差
im2=filters.gaussian_filter(im,9)
imshow(im2)

Python一些基本的图像操作和处理总结

from PIL import Image
# 彩色通道,三通道分别进行高斯滤波
im=array(Image.open('pic/landmark500x500.jpg'))
im2=np.zeros((im.shape))
for i in arange(3):
    im2[:,:,i]=filters.gaussian_filter(im[:,:,i],2)
    
# 转换为(0,255),否则imshow显示不出来
im2=uint8(im2)
figure(figsize=(5,5),dpi=80)
imshow(im2)
axis('off')

Python一些基本的图像操作和处理总结

4.2 图像导数

from PIL import Image
from numpy import *
from scipy.ndimage import filters

# filters.sobel(src,0/1,dst),0表示y方向的方向导数,1表示x方向的方向导数

figure()
im=array(Image.open('pic/building.tif'))
imshow(im)


imx=np.zeros(im.shape)

imy=np.zeros(im.shape)
filters.sobel(im,0,imy)
figure()
imx=uint8(imy)
imshow(imy)

figure()
filters.sobel(im,1,imx)
imy=uint8(imx)
imshow(imx)

figure()
mag=sqrt(imx**2+imy**2)
mag=uint8(mag)
imshow(mag)

show()

Python一些基本的图像操作和处理总结

第二/三张图是sobel算子在x/y方向的导数,第四张图是两个导数叠加成梯度。

4.3 形态学计数

# 形态学 对象计数
from scipy.ndimage import measurements,morphology

im=array(Image.open('pic/zhiwen.tif').convert('L'))
im2=np.zeros(im.shape)
im2=1*(im<128)

labels,nbr_objects=measurements.label(im2)

print(f"Number of objects is {nbr_objects}.")

labels=np.uint8(labels)
imshow(labels)

im_open=morphology.binary_opening(im2,ones((3,3)),1)
labels_open,nbr_objects_open=measurements.label(im_open)
print(f"Number of objects is {nbr_objects_open}.")

imshow(labels_open)

Python一些基本的图像操作和处理总结
Python一些基本的图像操作和处理总结

形态学计数使用label()函数,令图像的灰度值为标签,图一找到了114个物体,图二经过开操作,找到了17个物体。

到此这篇关于Python一些基本的图像操作和处理总结的文章就介绍到这了,更多相关Python图像操作和处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Python自动生产表情包
Mar 17 Python
TensorFlow损失函数专题详解
Apr 26 Python
Python单元测试实例详解
May 25 Python
Python if语句知识点用法总结
Jun 10 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
python3 map函数和filter函数详解
Aug 26 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
Python中and和or如何使用
May 28 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 Python
Python使用openpyxl批量处理数据
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
opencv-python图像配准(匹配和叠加)的实现
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
You might like
ThinkPHP php 框架学习笔记
2009/10/30 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
谨慎使用PHP的引用原因分析
2012/09/06 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
JS 进度条效果实现代码整理
2011/05/21 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
Python实现的简单算术游戏实例
2015/05/26 Python
Django内容增加富文本功能的实例
2017/10/17 Python
PyQt5实现简易电子词典
2019/06/25 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python模块future用法原理详解
2020/01/20 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
会走路的树教学反思
2014/02/20 职场文书
学习考察心得体会
2014/09/04 职场文书
个人党性分析总结
2015/03/05 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android
Nginx报404错误的详细解决方法
2022/07/23 Servers