kelly平时工作涉及比较多的图像处理工作。今天分享人工智能图像处理领域最常用的两个Python库:Pillow和OpenCV。
一、Pillow
源代码:https://github.com/python-pillow/Pillow
官方用户使用手册:https://python-pillow.org/
说到Pillow就不得不提到一个更早的Python图像库PIL(Python Imaging Library),PIL由于各种原因停止研发,Pillow作为PIL的派生分支、衍生品,功能更加强大,已经成为深度学习图像处理的标配之一。
Pillow作为图像处理库,提供了多种文件格式支持、高效的内部表示和非常强大的图像处理功能。Piilow的核心图像库是专为快速访问以几种基本像素格式存储的数据而设计。
安装方式:
pip install Pillow
学习Pillow之前,务必熟悉Pillow的坐标系统:
1、Pillow使用笛卡尔像素坐标系统,图像的坐标原点(0,0)为左上角。
2、一般而言,使用2个元素的(x, y)元组表示坐标,使用4个元素的(x1, y1, x2, y2)元组表示矩形,其中(x1, y1)为矩阵的左上角,(x2, y2)为矩阵的右下角。
常见使用示例:
打开图像
from PIL import Image
im = Image.open("图像名字.jpg")
查看图像的属性信息
print(im.format, im.size, im.mode)
显示图像
im.show()
图像类型转换PNG转为JPG
from PIL import Image
im = Image.open("图像名字.jpg")
im.save("保存的图像名字.jpg")
图像裁剪局部区域,并保存
box = (100, 100, 400, 400)
region = im.crop(box)
region.save("图像局部.jpg")
将两张图片从左到到合并为新的图像
im1 = Image.open("图像1.jpg")
im2 = Image.open("图像2.jpg")
w = im1.size[0] + im2.size[0]
h = max(im1.size[1], im2.size[1])
new_im = Image.new("RGBA", (w, h))
new_im.paste(im1)
new_im.paste(im2, (im1.size[0], 0))
new_im.save("region.jpg")
常见的几种几何变换
图像旋转
out = im.resize((128, 128))
out = im.rotate(45) # 逆时针方向旋转45度
图像转换
out = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
out = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
out = im.transpose(Image.Transpose.ROTATE_90)
out = im.transpose(Image.Transpose.ROTATE_180)
out = im.transpose(Image.Transpose.ROTATE_270)
图像增强:调整对比度、亮度、色彩平衡和锐度
from PIL import ImageEnhance
# 对比度
enhancer=ImageEnhance.Contrast(im)
enhancer.enhance(factor=2)
# 色彩饱和度
enhancer=ImageEnhance.Color(im)
enhancer.enhance(factor=2)
# 亮度
enhancer=ImageEnhance.Brightness(im)
enhancer.enhance(factor=2)
# 清晰度
enhancer=ImageEnhance.Sharpness(im)
enhancer.enhance(factor=2)
图像模糊
im2 = im.filter(ImageFilter.BLUR)
常见的几种绘画方式
画直线
from PIL import Image, ImageDraw
im = Image.open("原图.jpg")
draw = ImageDraw.Draw(im)
draw.line((200, 100, 300, 200), fill=(0, 0, 0), width=10)
im.show() #显示图像
?画椭圆
im = Image.open("原图.jpg")
draw = ImageDraw.Draw(im)
draw.ellipse(xy, fill=None, outline=None)
im.show()
?画矩形
im = Image.open("原图.jpg")
draw = ImageDraw.Draw(im)
draw.ellipse(xy, fill=None, outline=None)
im.show()
二、OpenCV简介
源代码仓库:https://github.com/opencv/opencv
拍黑板:OpenCV读取图像后的结果为Numpy.ndarray矩阵形式,而且默认为BGR三通道形式。
常见使用示例:
一般图像读取方式
img = cv2.imread("图像名字.jpg")
以灰度方式读取图像
img_grey = cv2.imread("图像名字jpg", cv2.IMREAD_GRAYSCALE)
显示图像
cv2.imshow()
保存图像
cv2.imwrite("保存图像名字.jpg",img)
创建一个黑色图片
img = np.zeros((256,256,3),np.uint8)
cv2.line(img, (0,0), (256,256),(255,255,0),2,cv2.LINE_AA)
plt.imshow(img)
plt.show()
画矩形
img = np.zeros((256,256,3),np.uint8)
cv2.rectangle(img, (44,44), (150,150),(255,0,0),2,cv2.LINE_AA)
plt.imshow(img)
plt.show()
画圆形,需要指定圆心坐标(97,97)和半径大小为53
img = np.zeros((256,256,3),np.uint8)
cv2.circle(img, (97,97), 53, (255,0,255),2,cv2.LINE_AA)
plt.imshow(img)
plt.show()
三、Pillow和OpenCV互转
在实际工作中,会经常混用这2个库,也需要掌握互相转换做法
首先导入各个图像库
import cv2
from PIL import Image
将OpenCV图像对象转换为PIL图像对象:
# 读取OpenCV图像对象
img_cv = cv2.imread('img_name.jpg')
# 转换为Pillow图像对象
img_pil = Image.fromarray(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB))
将Pillow图像对象转换为OpenCV图像对象:
# 读取Pillow图像对象
img_pil = Image.open('img_name.jpg')
# 转换为OpenCV图像对象
img_cv = cv2.cvtColor(numpy.array(img_pil), cv2.COLOR_RGB2BGR)
四、后记:
根据kelly的实践经验,Pillow和OpenCV在使用时有2个注意点:
1、Pillow读取图像并使用np.array转为Numpy.ndarray后,保存的是RGB通道,而OpenCV保存的是BGR通道,在Pillow和OpenCV互转时需要特别注意。
2、OpenV读取图像后已经是Numpy.ndarray矩阵,使用Ope
本文原始版本发表链接:
kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--