这个是对于 COVID-19 分类任务结束的一个回顾。第一次完成这个图像相关的任务,基本上是一头雾水。在这一次过程中遇到了很多处理的方法,在这里列出来,方便后面使用。

读取以及格式转换

图像处理一般使用 OpenCV 及 PIL.Image 两个库。

导入

1
2
import cv2
from PIL import Image

图像的读取与保存

1
2
3
4
5
img = cv2.imread("pic.jpg", flags)
cv2.imwrite(filename, img)

img = Image.open(filename)
img.save(filename)

关于 flags:

  • cv2.IMREAD_COLOR:读取一副彩色图片,图片的透明度会被忽略,默认为该值,实际取值为 1;
  • cv2.IMREAD_GRAYSCALE:以灰度模式读取一张图片,实际取值为 0
  • cv2.IMREAD_UNCHANGED:加载一副彩色图像,透明度不会被忽略。

以及文件名需要声明为 .jpg / .png 类似的格式才行。

与 Numpy 互换

事实上,cv2 导出的数据就是 np.array,例如对于彩色图像是(x, x, 3)的矩阵。而 Image 读出的是 Image 数据,需要转换:

1
2
img = Image.fromarray(data)   # 从array到Image
data = np.array(img) # 从Image到array

基本操作

裁剪

1
img = img.crop((x0, y0, x1, y1))

传入的是一个数组,标明左上角 x0, y0 及右下角 x1, y1。而由于 cv2 本质上是 np.array,所以可以使用 array 的操作完成。

Resize

Resize 是一个相当常用的函数。

1
2
img = img.resize((256, 256), Image.ANTIALIAS)
img = cv2.resize(img, (256, 256), interpolation = cv2.INTER_AREA)

后面是可选项。

深度学习相关

直方图均衡化

1
2
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 先转化为灰度图
img = cv2.equalizeHist(img) # 然后均衡化

随机变形

1
2
3
4
5
6
7
8
9
import torchvision.transforms as tfs
transform = tfs.Compose([
tfs.Resize((256, 256)), # 先调整图片大小至256x256
tfs.RandomCrop((224, 224)), # 再随机裁剪到224x224
tfs.RandomHorizontalFlip(), # 随机的图像水平翻转,通俗讲就是图像的左右对调
tfs.RandomRotation(5),
tfs.ToTensor(),
tfs.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.2225)), # 维度和图像的channel相关
])

调用时使用即可:

1
img = transform(img)