总结图像处理读与写的一些函数

总结一下前面所学、所用图像处理的一些函数,以后也会多多总结,因为有些函数常常容易忘记,这里就简单记录一下。

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后两者图像会出现差异,这个一定要多多注意,我自己本人就常常在这个地方迷糊。


这些是我自己对上一篇图像处理总结的一些函数,以后不会了就回来看看,虽然比较简单,但是好记性不如烂笔头嘛。
我会常常回来看自己写的一些东西,尤其是对函数的总结,有时会存在错误的情况,或者不是很理解的情况,因此我会对自己的文章进行修改

猜你喜欢

转载自blog.csdn.net/YYANyk/article/details/129799551