首先从pytorch出发,torchvision.transforms()要求传入的图像是PIL.Image格式(通道要求是RGB格式的),另外模型处理输入要转换为[1,channel,H,W];
所以最终导入torchvision.transforms()的图像格式需要转成PIL.Image,且需要在转换后增加batch维度([channel,H,W]变成[1,channel,H,W])
test_transform=torchvision.transforms.Compose([ ... transforms.ToTensor(), ... ]) input_img=test_transform(img_pil).unsqueeze(0) pred_logits=model(input_img)OpenCV和PIL.Image区别 1. PIL.Image
a. 读取图片
from PIL import Image img_pil = Image.open(path)
img_pil为PIL.JpegImagePlugin.JpegImageFile对象,图像形状(维度)是[W,H],通道是RGB。
注意:使用numpy库读取格式为(width, height)的pillow的图片后,
数据的格式自动转为(height, width, channels)
b.PIL转OpenCV
import cv2 from PIL import Image import numpy image = Image.open("plane.jpg") image.show() img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR) cv2.imshow("OpenCV",img) cv2.waitKey()
c.保存图像
注意:当往图片添加中文时,需要使用PIL
from PIL import ImageFont, ImageDraw # 导入中文字体,指定字号 font = ImageFont.truetype('SimHei.ttf', 32) draw = ImageDraw.Draw(img_pil) text=“我爱学python” draw.text((50, 100 + 50 ), text, font=font, fill=(255, 0, 0, 1)) # 保存图片 img_pil.save('output/img_pred.jpg')2. OpenCV
a. 读取图片
import cv2 img_cv2 = cv2.imread(path)
img_cv2为numpy.ndarray格式,是uint8类型,0-255范围,图像形状(维度)是[H,W,C],通道是BGR。
b.OpenCV转PIL
import cv2 from PIL import Image import numpy img = cv2.imread("plane.jpg") cv2.imshow("OpenCV",img) image =Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) image.show() cv2.waitKey()
c.保存图像
cv2可以保存英文。
import cv2 # 用 opencv 载入原图 img_bgr = cv2.imread(img_path) text=“我爱学python” img_bgr = cv2.putText(img_bgr, text, (25, 50 + 40 ), cv2.FONT_HERSHEY_SIMPLEX, 1.25, (0, 0, 255), 3) # 保存图像 cv2.imwrite('output/img_pred.jpg', img_bgr)