【python】python计算机视觉编程(一)

【python】Python计算机视觉编程(一)

  • PIL:python图像处理类库
    • 创建缩略图
    • 复制和粘贴图像区域
    • 调整尺寸和旋转
  • Matplotlib
    • 图像轮廓和直方图
    • 交互式标注
  • 结语

PIL:python图像处理类库

pip install Pillow
# 用pip安装
from PIL import Image


pil_im = Image.open("test.png")
# 读入一个名为test.png的图片
type(pil_im)
# 显示pil_im的数据类型,
pil_im.show()
# 生成一个窗口显示test.png图片
pil_im = Image.open("test.png").convert("L")
# 将test.png转化为灰度图
pil_im = Image.open("test.png").convert("1")
# 将test.png转化为二值图
pil_im.save("test.jpg")
# 保存图像
# pil_im是open读入的图片,将被保存为test.jpg
# 这里可以保存为不同格式的图片,.jpg或.png都可以
# 是新生成一张图片并保存,并不会覆盖原文件

创建缩略图

img = pil_im.thumbnail((128, 128))
# 创建pil_im的缩略图
pil_im.show()
# 显示生成的缩略图
img.show()
# 报错,因为.thumbnail改变的是原图,返回给img的值为None

thumbnail和resize的区别

  1. 正如上面的代码,thumbnail改变的原图,返回值为None;而resize原图不变,返回的是改变大小后的图
  2. thumbnail只能缩小图片
  3. thumbnail缩小图片是按原图的长宽比例;而resize改变图片尺寸是严格按照赋值的

复制和粘贴图像区域

box = (100, 100, 400, 400)
# 四元组表示剪裁区域
# 1,2,3,4元素分别对应,剪裁区域左边框到原图左边框的距离;剪裁区域上边框到原图上边框的距离;剪裁区域右边框到原图左边框的距离;剪裁区域下边框到原图上边框的距离
region = pil_im.crop(box)
# 按box取值切割原图pil_im,剪裁下来的图返回给region
region = region.transpose(Image.ROTATE_180)
# region旋转180度
pil_im.paste(region, box)
# 将旋转后的region粘贴回原处,这一操作会改变原图

调整尺寸和旋转

out = pil_im.resize((128, 128))
# 正如上面说的,resize原图不变,返回给out大小调整后的图片
out = pil_im.rotate(45)
# 旋转操作,参数是旋转角度

Matplotlib

pip install matplotlib
# pip安装
from PIL import Image
import matplotlib.pylab as plt


im = plt.array(Image.open("test.png"))
# 读取图片,并转为“numpy.ndarray”格式
# 因为下面的画点操作,所以要转成“numpy.ndarray”格式
plt.imshow(im)
# plt.imshow()指定了接下来的操作是对im执行,并显示其格式,不显示图像

x = [100, 100, 400, 400]
y = [200, 500, 200, 500]

plt.plot(x, y, "r*")

plt.plot(x[:2], y[:2])
# 连接前两个点,即(100,200)和(100,500)

plt.title('Plotting:"test.png"')
# 加标题

plt.axis("off")
# plt.axis是对坐标轴进行操作,"off"是去掉坐标轴

plt.show()
# 显示处理后的图像
# plt.show()过后,再想处理哪一张图片,需要用plt.imshow()重新指定
plt.axis()的参数 含义
‘on’ 打开坐标轴
‘off’ 关闭坐标轴
‘equal’ 通过改变轴取值的范围,使横轴和纵轴跨度相等。不改变图片尺寸,多出来的部分是空白
‘scaled’
‘tight’
‘auto’
’ normal’
‘image’
‘square’

图像轮廓和直方图

from PIL import Image
import matplotlib.pylab as plt


im = plt.array(Image.open("test.png").convert("L"))

plt.figure()
# 新建一个图像,并指定下面的操作是在这个图像上
plt.gray()
# 设置这个图像为单通道图像,即灰度图

plt.contour(im, origin="image")
# 画轮廓

plt.axis("equal")
plt.axis("off")

plt.figure()
# 再创建一个新图像,接下来的操作是在这个图像上

plt.hist(im.flatten(), 128)
# 绘制直方图
# im.flatten()将转化为“numpy.ndarray”格式的原图像按行有限准则变成一维数组
# 128指定了有128个直方条形图,每个条的高度,是一维数组中,落入这个条的像素值的和

plt.show()
# 显示两张图像

交互式标注

from PIL import Image
import matplotlib.pylab as plt


im = plt.array(Image.open("test.png"))
plt.imshow(im)

x = plt.ginput(3)
# 显示原图像,等待点击三次,将位置信息返回给列表x

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

你可能感兴趣的:(python)