本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

python 图像处理基本操作

发布于2021-06-07 20:48     阅读(1061)     评论(0)     点赞(21)     收藏(4)


一、PIL库对图像的基本操作

1、读取图片

PIL网上有很多介绍,这里不再讲解。直接操作,读取一张图片,将其转换为灰度图像,并打印出来。

  1. from PIL import Image
  2. import matplotlib.pyplot as plt
  3. pil_im = Image.open("empire.jpeg")
  4. pil_image = pil_im.convert("L")
  5. plt.gray()
  6. plt.imshow(pil_image)
  7. plt.show()

输出如下所示:

2、转换图片格式

PIL可以将图像保存为多种格式,下面将PNG格式文件保存为JPG格式:

  1. from PIL import Image
  2. import glob
  3. import os
  4. filelist = glob.glob("E:/pythonProject1/filelist/*.png")
  5. for infile in filelist:
  6. outfile = os.path.splitext(infile)[0]+'.jpg'
  7. if infile != outfile:
  8. try:
  9. Image.open(infile).save(outfile)
  10. except IOError:
  11. print("cannot convert", infile)

输出结果如下所示:

3、输出文件夹中所有图片的文件名列表

  1. import os
  2. def get_imlist(path):
  3. """返回目录中所有JPG图像的文件名列表"""
  4. return [os.path.join(path,f)for f in os.listdir(path) if f.endswith('.jpg')]
  5. print(get_imlist("E:/pythonProject1/filelist/"))

输出为文件名列表

二、Matplotlib

1、绘制图像、点和线

  1. from PIL import Image
  2. from pylab import *
  3. #读取图像到数组中
  4. im = array(Image.open("empire.jpeg"))
  5. #绘制图像
  6. imshow(im)
  7. #一些点
  8. x = [100, 100, 400, 400]
  9. y = [200, 500, 200, 500]
  10. #使用红色星状标记绘制点
  11. plot(x, y)#默认为蓝色实线
  12. # plot(x, y, 'r*')#红色星状标记
  13. # plot(x, y, 'go-')#带有圆圈标记的绿线
  14. # plot(x, y, 'ks')#带有正方形标记的黑色虚线
  15. #绘制连接前三个点的线
  16. plot(x[:3], y[:3])
  17. axis('off')
  18. #添加标题,显示绘制的图像
  19. titles = ['empire']
  20. plt.title = titles
  21. show()

上面的代码首先绘制出原始图像,然后在 x 和 y 列表中给定点的 x 坐标和 y 坐标上绘制出红色星状标记点,最后在两个列表表示的前两个点之间绘制一条线段。该例子的绘制结果下图:

2、图像轮廓和直方图

绘制轮廓需要对每个坐标 [x, y] 的像素值施加同一个阈值,所以首先需要将图像灰度化,这里用 PIL 的 convert() 方法将图像转换成灰度图像。图像的直方图用来表征该图像像素值的分布情况。

  1. from PIL import Image
  2. from pylab import *
  3. # 读取图像到数组中
  4. im = array(Image.open("empire.jpeg").convert('L'))
  5. #创建一个图像
  6. figure()
  7. #不使用颜色信息
  8. gray()
  9. #在原点的左上角显示轮廓图像
  10. contour(im, origin = 'image')#检测图像轮廓
  11. axis('equal')
  12. axis('off')
  13. show()
  14. #新建一个图像
  15. figure
  16. hist(im.flatten(), 128)#绘制图像直方图
  17. show()

图像轮廓图输出如下所示:

输出图像直方图如下所示:

3、交互式标注

在一幅图像中标记一些点,或者标注一些训练数据。PyLab 库中的 ginput() 函数就可以实现交互式标注。在图像点击三次,则程序会自动将这3个点的坐标点[x, y]保存到x列表里。

  1. from PIL import Image
  2. from pylab import *
  3. im = array(Image.open("empire.jpeg"))
  4. imshow(im)
  5. print("please click 3 points")
  6. x = ginput(3)
  7. print("you clicked",x)
  8. show()

三、Numpy

1、图像数组表示

对于图像数据,下面的例子阐述了这一点

  1. from PIL import Image
  2. import numpy as np
  3. im = np.array(Image.open("empire.jpeg"))
  4. print(im.shape,im.dtype)

输出为:
(1024, 683, 3) uint8

 每行的第一个元组表示图像数组的大小(行、列、颜色通道),紧接着的字符串表示数组元素的数据类型。因为图像通常被编码成无符号八位整数(uint8),载入图像并将其转换到数组中,数组的数据类型为“uint8”。

2、灰度变换

对图像进行灰度变换,如下所示:

  1. from PIL import Image
  2. import numpy as np
  3. im = np.array(Image.open("empire.jpeg"))
  4. print(im.shape,im.dtype)
  5. from PIL import Image
  6. from matplotlib.pylab import plt
  7. from numpy import *
  8. im1 = array(Image.open('empire.jpeg').convert('L'))
  9. im2 = 255 - im1 #对图像进行反向处理
  10. im3 = (100.0/255) * im1 + 100 #将图像值变换到100-200之间
  11. im4 = 255.0 * (im1/255) ** 2 #对图像像素值求平方后得到的图像
  12. images = [im1, im2, im3, im4]
  13. titles = ["f(x) = x", "f(x) = 255 - x", "f(x) = (100/255)*x +100", "f(x) = 255*(x/255)^2"]
  14. #输出图中的最大像素值和最小像素值
  15. print(int(im1.min()),int(im1.max()))
  16. print(int(im2.min()),int(im2.max()))
  17. print(int(im3.min()),int(im3.max()))
  18. print(int(im4.min()),int(im4.max()))
  19. for i in range(4):
  20. plt.subplot(2, 2, i+1)#2行2列,按编号顺序排列
  21. plt.imshow(images[i])#显示图像
  22. plt.title(titles[i])#显示标题
  23. plt.gray()
  24. # plt.xticks([])
  25. # plt.yticks([])
  26. plt.axis('equal')
  27. plt.axis('off')
  28. plt.show()

输出接入如下所示:



所属网站分类: 技术文章 > 博客

作者:搜嘎皮卡

链接:http://www.phpheidong.com/blog/article/89501/d80d6ea99c1233af10a7/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)