总结一下前面所学、所用图像处理的一些函数,以后也会多多总结,因为有些函数常常容易忘记,这里就简单记录一下。
1.读取图像
from PIL import Image
img = Image.open(’img’)
#读取当前目录下的图片’img’
#读取当前目录文件下的图片'./file/img'
import cv2
img = cv2.imread(’img’)
2.显示图像
plt.imshow(img)
cv2.imshow('img',img)
#设置图片展示时间
cv2.waitKey()
#释放内存
cv2.destroyAllWindows()
3.存储图像
#以jpg格式进行存储,名字为img
img.save('img.jpg')
img.save('save.jpg')
#还可以指定图片保存的质量
img.save('new1.jpg',quality=95),默认值为75
cv2.imwrite('im_8.jpg',im8)
#保存图片,命名为im8
5.调整图像大小
# 调整大小为(300,300)
img2 = cv2.resize(img2,(300,300))
4.创造画布
matplotlib.pyplot.figure(num=None,
figsize=None,
dpi=None,
facecolor=None,
edgecolor=None,
frameon=True,
FigureClass=<class 'matplotlib.figure.Figure'>,
clear=False,
**kwargs)
plt.figure(figsize=(4,4))
- num:图像编号或名称,数字为编号 ,字符串为名称。不指定调用figure时就会默认从1开始。
- figsize:指定figure的宽和高,单位为英寸
- dpi参数指定绘图对象的分辨率,即每英寸多少个像素
- facecolor:背景颜色
- edgecolor:边框颜色
- frameon:是否显示边框
plt.figure(figsize=(x,y))
这个后面的函数一般都用不上主要是figsize=(x,y)设置窗口大小
5.创造单个子图
subplot(nrows,
ncols,
sharex,
sharey,
subplot_kw,
**fig_kw)
- nrows 表示 subplot 的行数
- ncols 表示 subplot 的列数
- sharex 表示 subplot 中 x 轴的刻度,所有的 subplot x 轴应该保持相同的刻度
- sharey 表示 subplot 中 y 轴的刻度,所有的 subplot y 轴应该保持相同的刻度
6.shape函数的用法
shape函数的功能是读取矩阵或数组的长度
#通常有三种使用方法:shape[0],shape[1],shape
shape[0] #读取行数
shape[1]#读取列数
img.shape#行列数组成元组直接输出
7.np.zeros函数
zeros(shape, dtype=float, order=‘C’)
- shape:形状
- dtype:数据类型,可选参数,默认numpy.float64
- order:可选参数,c代表与c语言类似,行优先;F代表列优先
np.zeros((h,w),np.uint8)
#创造h行w列数据类型为np.uint8的全0数组
8.flatten()函数用法
flatten()是对多维数据的降维函数
flatten(),默认缺省参数为0
适用:numpy对象,即数组array或者矩阵MAT,普通的list列表不可以
# flatten可将二维数组转化为一维
image.flatten()
9.hist函数–用于绘制直方图
hist(image.flatten(), 128)
show()#展示
- hist(data,nbins);
- data是待统计的向量,nbins是需要划分的条数(默认为10)
10.PIL中convert(‘L‘)函数
img.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)
- matrix:可选的转换矩阵。如果给定,则应为包含浮点值的4元组或12元组。
- dither:抖动方法,在从模式“RGB”转换为“ P”或从“ RGB”或“ L”转换为“1”时使用。可用的方法有:data:
NONE
或:data:FLOYDSTEINBERG
(默认)。请注意,在提供``matrix’'时不使用此选项。 - palette:从模式“ RGB”转换为“ P”时使用的调色板。可用的调色板是WEB或ADAPTIVE。
- colors:用于“ ADAPTIVE”调色板的颜色数。 默认值为256。
PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
img.convert(‘1’)
为二值图像,非黑即白。每个像素用8个bit表示,0表示黑,255表示白。
img.convert(‘L’)
为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
11.图像拼接
# 图片集地址
IMAGES_PATH = 'img/'
# 图片格式
IMAGES_FORMAT = ['.bmp','.jpg']
# 每张小图片的大小为256
IMAGE_SIZE = 256
# 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_ROW = 2
# 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_COLUMN = 2
# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
os.path.splitext(name)[1] == item]
print(image_names)
# 简单的对于参数的设定和实际图片集的大小进行数量判断
l=len(image_names)
if l!=IMAGE_SIZE*IMAGE_COLUMN:
print('错误')
def image_compose():
# 创建一个新图
to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))
# 循环遍历,把每张图片按顺序粘贴到对应位置上
for y in range(1, IMAGE_ROW + 1):
for x in range(1, IMAGE_COLUMN + 1):
from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
(IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)
to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
plt.imshow(to_image)
return to_image.save("拼接结果.jpg") # 保存拼接之后的结果图
12.灰度图像转换
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
13.复制图像
dst1 = img1.copy()#对原图像复制
14.图像融合(将两张图片放在同一个张上)
import cv2 # 用于图像处理和操作
#采用cv2读取24.bmp图像
img1 = cv2.imread('24.bmp')
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
#采用cv2读取1.jpg图像
img2 = cv2.imread('1.jpg')
# 调整大小为(300,300)
img2 = cv2.resize(img2,(300,300))
# 获取矩阵行、列和维度
#rows = img2.shape[0]
#cols = img2.shape[1]
#channels = img2.shape[2]
rows,cols,channels = img2.shape
roi = img1[0:rows,0:cols]
dst = cv2.addWeighted(img2, 0.9, roi, 0.1, 0)#图像融合
dst1 = img1.copy()#对原图像进行拷贝
dst1[0:rows,0:cols] = dst
plt.imshow(dst1)
plt.show()
cv2.imshow('dst',dst)#查看融合结果
cv2.imshow('reusult',dst1)#显示处理后的结果
cv2.imshow('roi',roi)
cv2.imshow('img2',img2)
#保存为reusult.jpg
cv2.imwrite('reusult.jpg',dst1)
# 设置图片展示时间
cv2.waitKey()
# 释放内存
cv2.destroyAllWindows()
"""
cv2.imshow()和plt.imshow()的区别
如果需要展示读入的图像,或者展示对读入图像进行一系列操作后的图像时,使用cv2.imshow()
如果不需要展示原始图像,而是绘制一张新的图像,使用plt.imshow()
注意
opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,
需要进行通道转换。
在展示灰度图像时,cv2.imshow(‘gray’, gray)
plt.imshow(gray,cmap=‘gray’), plt.title(‘gray’)
"""
15.对于彩色图像无法转化灰度的问题
cv2.imshow()和plt.imshow()的区别
如果需要展示读入的图像,或者展示对读入图像进行一系列操作后的图像时,使用cv2.imshow()
如果不需要展示原始图像,而是绘制一张新的图像,使用plt.imshow()
注意
opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,
需要进行通道转换。
在展示灰度图像时,cv2.imshow(‘gray’, gray)
plt.imshow(gray,cmap=‘gray’), plt.title(‘gray’)
我们首先要知道两者的不同,两者的通道不同,因此在使用plt.show和cv2.imshow后两者图像会出现差异,这个一定要多多注意,我自己本人就常常在这个地方迷糊。
这些是我自己对上一篇图像处理总结的一些函数,以后不会了就回来看看,虽然比较简单,但是好记性不如烂笔头嘛。
我会常常回来看自己写的一些东西,尤其是对函数的总结,有时会存在错误的情况,或者不是很理解的情况,因此我会对自己的文章进行修改