python图像处理库(PIL&OpenCV)快速入门学习

文章目录

  • PIL
    • 基本操作
      • 读取和创建
      • 基本变换方法
    • 图像处理
      • 图像滤波
      • 图像增强
    • PIL与Numpy
  • OpenCV-python库
    • 读取操作
    • 基本变换
    • 图像处理
      • 图像滤波

Python下可以进行图像处理的第三方库有很多:
最轻巧:PIL: https://pillow.readthedocs.io/en/latest/index.html
最全面:OpenCV: https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html
其他还有:matplotlib、scipy.misc、scikit-image等。

PIL

PIL库支持图像存储、显示和处理。几乎支持所有的图片格式 可以完成图像的缩放、裁剪、叠加以及向图像添加线条、图像和文字等操作。

PIL库中包含21个与图片相关的类:
最常用的有: Image,ImageEnhance,ImageFilter

基本操作

读取和创建

from PIL import Image

在PIL中,任何图像都可以用Image对象表示

方法 描述
Image.open(filename,mode=‘r’) 根据文件名读取图片
Image.new(mode,size color) 根据给定参数创建一个新图像
Image.fromarray(obj, mode=None) 从array数据创建图像
Image.show() 显示图像
Image.save(fp,format=None) 图像保存(可以完成格式转换)

Image的属性

属性 描述
Image.format 图像格式
Image.filename 图像的文件名或路径
Image.mode 图像色彩模式,L为灰度,RGB为真彩
Image.size 图像的宽和高,返回二元元组

读取序列图片(gif等):使用seek()和tell()方法

基本变换方法

方法 描述 参数解释
Image.convert(mode) 图像转换为新的模式 mode=“L”或“RGB” 或“CMYK.”
Image.thumbnail(size) 创建缩略图 szie-一个元组(长,宽)
Image.rotate(angle) 图像旋转 angel-要旋转的角度
Image.resize(size) 调整图像尺寸 size-一个元组(长,宽)
Image.crop(box) 图像裁剪(ROI) (left, upper, right, lower)-tuple
Image.split()
Image.merge(mode, bands)
提取RGB每个颜色通道
合并通道
mode-图像色彩模式
band-通道(r,g,b)

图像处理

图像处理(Image Processing)是指对图像进行分析、加工、和处理,使其满足视觉、心理或其他要求的技术。

图像滤波

图像滤波采用的是ImageFilter类,通过Image类的filter方法

 def filter(self, filter):
        """
        Filters this image using the given filter.  For a list of
        available filters, see the :py:mod:`~PIL.ImageFilter` module.

        :param filter: Filter kernel.
        :returns: An :py:class:`~PIL.Image.Image` object."""

imobj.filter(ImageFilter.xxx)

常用滤波函数:

方法 描述
ImageFilter.BLUR 模糊效果
ImageFilter.CONTOUR 轮廓效果
ImageFilter.DETAL 细节效果
ImageFilter.EDGE_ENHANCE 边界加强效果
ImageFilter.SMOOTH 平滑效果
ImageFilter.SHARPEN 图像锐化
from PIL import ImageFilter,Image
imobj = Image.open("D:\image.jpg")
imobj.filter(ImageFilter.xxx)

图像增强

使用 ImageEhance 类,常用的方法有:

方法 描述
ImageEhance.enhance(factor) 对选择属性的数值增强factor倍
ImageEhanceColor(im) 调整颜色平衡
ImageEhance.Contrast(im) 调整对比度
ImageEhance.Brightness(im) 调整亮度
ImageEhance.Sharpness(im) 调整锐度

PIL与Numpy

PIL读取的图片是Image对象,不是Numpy矩阵,两者可以进行转化。

im=Image.open("D:\image.jpg") # 读取一张图片
print(im.shape)  # 输出图片的尺寸
im_arr = np.array(im) # 将图片转化为numpy矩阵 
print(im_arr.shape) # 输出此时的尺寸

(432,640)
(640,432,3)

注意图片转化为矩阵时,w和h通道会发生改变

OpenCV-python库

读取操作

  • 读取图片:imread
    cv2.imread(filename),读取的图像直接表示ndarray类型的三维矩阵,彩色图片的维度是(h,w,c)

  • 显示图片:imshow
    cv2.imshow(window_name,img),需配合cv2.waitKey()才能显示

import cv2
im=cv2.imread("image.jpg")
cv2.imshow("win_image",im)
cv2.waitKey()
  • 保存图片:imwriter
    cv2.imwrite(filename,image)
  • 图像通道
    用cv2打开的彩色三通道的通道顺序是BGR,而不是RGB。可以使用split()和merge()方法实现通道转换
im=cv2.imread('image.jpg')
b,g,r=cv2.split(im)
im2=cv2.merge((r,g,b))
cv2.imshow('ImWindow',im2)
cv2.waitKey()

基本变换

  • 图像缩放:resize()
    参数:
    src: 输入图像对象
    dsize:输出矩阵/图像的大小,为0时计算方式如下:dsize = Size(round(fxsrc.cols),round(fysrc.rows))
    fx: 水平轴的缩放因子,为0时计算方式: (double)dsize.width/src.cols
    fy: 垂直轴的缩放因子,为0时计算方式: (double)dsize.heigh/src.rows
    interpolation:插值算法
     cv2.INTER_NEAREST : 最近邻插值法
     cv2.INTER_LINEAR 默认值,双线性插值法
     cv2.INTER_AREA 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
     cv2.INTER_CUBIC 基于4x4像素邻域的3次插值法
      cv2.INTER_LANCZOS4 基于8x8像素邻域的Lanczos插值
    cv2.INTER_AREA 适合于图像缩小, cv2.INTER_CUBIC (slow) & cv2.INTER_LINEAR 适合于图像放大
  • 颜色空间的转换:cv2.cvtColor()

参数: img: 图像对象
code:
cv2.COLOR_RGB2GRAY: RGB转换到灰度模式
cv2.COLOR_RGB2HSV: RGB转换到HSV模式(hue,saturation,Value)
cv2.COLOR_BGR2RGB:RGB通道转换

im=cv2.imread('image.jpg')
gray=cv2.cvtColor(im,COLOR_RGB2GRAY)
cv2.show('gray',gray)
cv2.waitKey()
  • 图像阈值化:cv2.threshold()
    有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
    cv2.THRESH_BINARY(黑白二值)
    cv2.THRESH_BINARY_INV(黑白二值反转)
    cv2.THRESH_TRUNC (得到的图像为多像素值)
    cv2.THRESH_TOZERO
    cv2.THRESH_TOZERO_INV
    返回两个值
    ret:阈值
    img:阈值化处理后的图像
  • 旋转:cv2.getRotationMatrix2D()
    参数:
    center:旋转的中心点坐标
    angle:旋转角度,单位为度数,证书表示逆时针旋转
    scale:同方向的放大倍数
    返回2*3的转变矩阵(浮点型)
  • 图像的矩阵变换:transpose()
    OpenCV读入图片的矩阵格式是:(h, w, c)。 深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式(c, h, w)
print(im.shape) # (326,220,3)
im=im.tanspose(2,0,1)  
print(im.shape)  # (3,326,222)

在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)

im=np.expand_dims(im,axis=0)
print(im.shape) #(1,3,326,220)

图像处理

图像滤波

参考链接:
http://c.biancheng.net/pillow/picture-format.html
https://www.cnblogs.com/silence-cho/p/10926248.html
https://blog.csdn.net/qq_36941368/article/details/82998296

你可能感兴趣的:(2022,python,计算机视觉,opencv,图像处理)