结论:对于图像处理,还是直接用PIL先处理比较好
再补充一点:在深度学习中最好采用png
的图像格式,可参考:深度学习中图像格式选用jpg还是png?答:png
关于numpy.array的两个知识点:
- 取得array所有元素中的的最大值:
np.max(array)
- 对比两个array是否所有元素都相同:
(array1 == array2).any()
,只会返回一个True或者False,如果没有.any()
进行比较,则会返回很多个True或False
1. 用PIL读入后,是直接对图像整体做操作
常用操作:
先用PIL读入:
from PIL import Image
image = Image.open(image_path)
-
裁剪 crop:
newimage = image.crop(box)
,box是一个四元组: ( x m i n , y m i n , x m a x , y m a x ) (x_{min},y_{min},x_{max},y_{max}) (xmin,ymin,xmax,ymax),指明了左上、右下两个坐标位置 -
缩放 resize:
newimage = image.resize((w, h), Image.ANTIALIAS)
,(w,h)是指定缩放后的宽高,Image.ANTIALIAS表示会高质量缩放,不过现在使用的话会有警告,介意的话按照指示更改为Resampling.LANCZOS
即可
-
旋转 rotate:
newimage = image.rotate(-45)
,-45
表示指定的旋转角度(当旋转角度为负数时,则表示顺时针旋转),可改为其他任意数字,旋转后默认以黑色填充画面(若想要更改填充颜色为其他颜色,则可参见我的另一篇博客:【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)) -
翻转 transpose:
newimage = image.transpose(0)
,0表示选择的某种方式进行翻转,翻转共有6种方式,取值为0~5,依次为:[‘左右镜像’, ‘上下镜像’, ‘旋转90°’, ‘旋转180°’, ‘旋转270°’, ‘颠倒顺序’]
2. 如果要涉及到像素的处理(3个步骤)
- 则先用PIL读入
- 再转成nmupy后对一部分的像素值调整
- 再转回PIL保存(这样可以保留图片的原始模式,特别是对于图像分割中的8bit标签图,采用PIL模式保存还是会同样是8bit)
留坑2:要再去写一下代码试试
3. 以下为本次实验记录
from PIL import Image
import numpy as np
import cv2
if __name__ == '__main__':
# 1. ---------验证mask用cv2 和 PIL读取后再转为numpy的像素值是否相同:相同------- #
path = r'D:\SoftWareInstallMenu\JetBrains\PycharmProjects\tunnel_datadeal\crackop\augment\labels\1.png'
image = Image.open(path)
image_cv = cv2.imread(path, 0)
pil2np = np.array(image)
pil2np_2 = np.asanyarray(image)
# 全都为True
print((pil2np == image_cv).any())
print((pil2np_2 == image_cv).any())
print((pil2np_2 == pil2np).any())
print(f'image_cv = {image_cv}, shape = {image_cv.shape}, ndim = {image_cv.ndim}')
print(f'pil2np = {pil2np}, shape = {pil2np.shape}, ndim = {pil2np.ndim}')
# 2. ----------或者cv2读取后的数组用PIL保存后,用PIL读取出来的像素值是否相同:不相同(期待值是11)----- #
# -------------但是用pil2np转回pil,用PIL读取出来的像素值是否相同:相同(期待值是11)--------------- #
# image_cv2pil = Image.fromarray(image_cv) # 89
# image_cv2pil = Image.fromarray(pil2np) # 11
image_cv2pil = Image.fromarray(pil2np_2) # 11
width, height = image_cv2pil.size
pixels1 = set() # 存放原始pil的像素值。集合,只会存储不同的元素
pixels2 = set() # 存放cv2pil的像素值
for w in range(width):
for h in range(height):
pixels1.add(image.getpixel((w, h)))
pixels2.add(image_cv2pil.getpixel((w, h)))
print(f'pixels1 = {pixels1}')
print(f'pixels2 = {pixels2}')
# 3. ----------将cv2pil的再转回numpy,看是否与image_cv相同:相同---------------- #
image_cv2pil_2cv = np.array(image_cv2pil)
print((image_cv == image_cv2pil_2cv).any()) # True
print((pil2np == image_cv2pil_2cv).any()) # True