文章目錄
- 前言
- 1、前置基礎知識
- 1.1. 讀取圖像
- 1.2. cv2和pil互相轉化
- 1.3. 轉成pil進行可視化
- 1.4. cv2和pil儲存圖像
- 2、mmcv
- 2.1. 變換圖像尺寸Resize
- 2.2. 填充圖像
- 2.3. 圖像左右翻轉變化
- 總結
前言
本篇主要對mmdet中經常使用mmcv某些API做介紹。
1、前置基礎知識
mmcv中包含了大量圖像處理的函數,最常用到的兩個庫就是cv2和pillow。是以,對這兩個庫常用的API做下簡要介紹。
1.1. 讀取圖像
import cv2
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
# h>w的圖像: (1133, 800, 3)
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000001.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]
print('h:', h, 'w:',w)
img = Image.open(img_path)
w,h = img.size
print('w:', w, 'h:',h)
注意cv2傳回的是圖像的h和w,而pil傳回的是圖像的w和h!!
1.2. cv2和pil互相轉化
import cv2
import numpy as np
from PIL import Image
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# pil --> cv2
image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
1.3. 轉成pil進行可視化
一般在IDE中進行編碼,是以轉成PIL更加友善可視化,貼下可視化pil圖像代碼:
from PIL import Image
import matplotlib.pyplot as plt
img = open(img_path)
plt.imshow(img)
plt.show()
1.4. cv2和pil儲存圖像
隻需注意儲存的是絕對路徑即可。
cv2.imwrite('abs_path', img) # img是經cv2.imread讀取的
img.save('abs_path') # img 是經 Image.open()讀取的
2、mmcv
這裡貼下mmdet中常使用的資料集處理字段:
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]
2.1. 變換圖像尺寸Resize
分别選取了兩張h>w和w>h的圖像進行Resize變換,mmdet中變換操作就是讓比例較小的一邊變成指定的一邊,然後另一邊進行scale縮放。當然,變換完成後和原始圖像的h和w的大小順序不發生改變。
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
from mmcv.image import imrescale
# h>w的圖像: (1133, 800, 3),可視化第一張圖像
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000001.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]
img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow(img)
plt.show()
# w>h的圖像 :(800, 1067, 3), 可視化第二張圖像
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000003.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]
img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow(img)
plt.show()
2.2. 填充圖像
在Resize基礎上, Pad操作就是填充寬和高讓其兩邊成為32的倍數。貼下總的代碼:
import cv2
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
from mmcv.image import imrescale
# h>w的圖像: (1133, 800, 3)
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000001.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]
img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow(img)
plt.show()
#pad
from mmcv.image import impad_to_multiple
import numpy as np
# pil --> cv2
image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
pad_img = impad_to_multiple(image, divisor=32, pad_val= 0)
print(pad_img.shape)
pad_img = Image.fromarray(cv2.cvtColor(pad_img, cv2.COLOR_BGR2RGB))
plt.imshow(pad_img)
plt.show()
# w>h的圖像 :(800, 1067, 3)
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000003.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]
img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow(img)
plt.show()
#pad
from mmcv.image import impad_to_multiple
import numpy as np
# pil --> cv2
image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
pad_img = impad_to_multiple(image, divisor=32, pad_val= 0)
print(pad_img.shape)
pad_img = Image.fromarray(cv2.cvtColor(pad_img, cv2.COLOR_BGR2RGB))
plt.imshow(pad_img)
plt.show()