《Python计算机视觉编程》学习笔记

第一章 基本的图像操作和处理

1.1 PIL:Python图像处理类库

PIL提供了通用的图像处理功能,以及基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。利用PIL中的函数,可以从图像格式的文件中读取数据,然后写入图像格式文件中。

图像的颜色转换:convert()

from PIL import Image
from matplotlib import pyplot as plt

plt.figure(figsize=(8,6))
color_img = Image.open('picture1.jpg')
plt.subplot(121)
plt.imshow(color_img,cmap='gray')
# 不显示坐标轴
plt.axis('off')
# 转换成灰度图像
gray_img = color_img.convert('L')
plt.subplot(122)
plt.imshow(gray_img,cmap='gray')
plt.axis('off')
plt.show()

从输出结果可以看到,通过convert(‘L’)方法可以将彩色图像转换为灰度图像。

1.1.1 转换图像格式

from PIL import Image
import os

# 想要更改图片所在的根目录
rootdir = "/Users/xionglulu/Desktop/picture"
# 获取目录下文件名清单
files = os.listdir(rootdir)

# 对文件名清单里的每一个文件名进行处理
for filename in files:
    portion = os.path.splitext(filename)  # portion为名称和后缀分离后的列表   #os.path.splitext()将文件名和扩展名分开
    if portion[1] == ".png":  # 如果为后缀为.png则更改名字
        newname = portion[0] + ".jpg"  # 要改的新后缀  #改好的新名字
        print(newname)  # 打印出更改后的文件名
        os.chdir(rootdir)  # 修改工作路径
        os.rename(filename, newname)  # 在工作路径下对文件名重新命名

实现批量转换图像格式的方法:1.获取图像所在根目录下所有文件名清单2.对文件名进行分割处理3.转换文件名格式4.更新路径对图像重新命名。

在此实验中,对文件名的分割是关键,使用os.path.splitext(filename) 方法可以使文件名分割为名称和后缀,os.rename(filename, newname) 方法可以在指定路径下对文件重新命名。

1.1.2 图像的缩略、复制粘贴图像区域、调整尺寸和旋转

图像缩略:thumbnail()

该方法可以将图像转化为指定参数大小的缩略图。

from PIL import Image
from matplotlib import pyplot as plt
# plt.figure(figsize=(8,6))
color_img= Image.open('picture1.jpg')
plt.subplot(121)
plt.imshow(color_img,cmap='gray')
#创建缩略图
color_img.thumbnail((128,128))
plt.subplot(122)
plt.imshow(color_img,cmap='gray')
plt.show()

从输出结果可以看到,原图像转换为最长边为128像素的缩略图。

复制粘贴图像区域:crop()、paste()

使用crop()方法可以从一幅图像中裁剪指定区域,该区域由四元组来指定。四元组的坐标依次是(左、上、右、下)。可以使用paste()方法将裁剪区域放回去。

from PIL import Image
from matplotlib import pyplot as plt
# plt.figure(figsize=(8,6))
color_img= Image.open('picture1.jpg')
plt.subplot(121)
plt.imshow(color_img,cmap='gray')
box=(500,500,1000,1000)
region=color_img.crop(box)
region=region.transpose(Image.ROTATE_180)
color_img.paste(region,box)
plt.subplot(122)
plt.imshow(color_img,cmap='gray')
plt.show()

从结果对比图可以看到,将指定区域裁剪后,旋转180度放了回去,四元组为(500,500,1000,1000)。

调整尺寸和旋转:resize()、rotate()

使用resize()方法将原图像调整为指定参数大小,使用rotate()方法将原图像逆时针旋转指定角度。

from PIL import Image
from matplotlib import pyplot as plt
# plt.figure(figsize=(8,6))
color_img= Image.open('picture1.jpg')
plt.subplot(221)
plt.imshow(color_img,cmap='gray')
#调整尺寸
p1=color_img.resize((128,64))
plt.subplot(222)
plt.imshow(p1,cmap='gray')
#旋转图像
p2=color_img.rotate(65)
plt.subplot(223)
plt.imshow(p2,cmap='gray')
plt.show()

从输出结果可以看出原图像尺寸变小,原图像逆时针旋转了65度。

1.2 Matplotlib

运用Matplotlib可以处理数学运算、绘制图表、在图像上绘制点、直线和曲线,它是一个类库,具有比PIL更强大的绘图功能。Matplotlib中的Pylab接口包含很多创建图像的函数。

1.2.1 绘制图像、点和线

from PIL import Image
from pylab import *
#读取图像到数组中
color_im=array(Image.open('picture1.jpg'))
#绘制图像
plt.imshow(color_im)
#一些点
x=[100,100,400,400]
y=[200,500,200,500]
#使用红色星状标记绘制点
plot(x,y,'r*')
#绘制连接这些点的线
plot(x[:4],y[:4])
plt.show()

通过结果图可以看出,代码首先绘制出原图像,然后在x和y列表中给定点的x坐标和y坐标上绘制出红色星状标记点,最后在两个列表表示的四个点之间绘制一条线。

1.2.2 图像轮廓和直方图

因为绘制图像的轮廓图需要对每个坐标[x,y]的像素值施加同一个阈值,所以需要首先将图像灰度化。

图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。

灰度图像的直方图用hist()函数绘制:hist()函数的第二个参数指定小区间的数目。

注意:因为hist()只接受一维数组作为输入,所以在绘制图像直方图之前,必须先对图像进行压平处理。flatten()方法将任意数组按照行优先准则转换为一维数组。

from PIL import Image
from pylab import *
#读取图像到数组中
gray_im=array(Image.open('picture1.jpg').convert('L'))
#新建一个图像
figure()
#不使用颜色信息
gray()
#显示轮廓图像
subplot(121)
contour(gray_im,origin='image')
axis('equal')
axis('off')
#绘制图像直方图
subplot(122)
hist(gray_im.flatten(),128)
show()

由直方图结果可以看出该灰度图像的亮度较高,灰度值主要集中在100-200之间。

1.2.3 交互式标注

from PIL import Image
from pylab import *
im=array(Image.open('picture1.jpg'))
imshow(im)
print('Please click 3 points')
g=ginput(3)
print("you clicked:",g)
show()

1.3 NumPy

NumPy是Python科学计算工具包,包含数组对象以及线性代数函数。

1.3.1  图像数组表示

from PIL import  Image

from  numpy import *
im=array(Image.open('picture1.jpg'))
print(im.shape,im.dtype)
im=array(Image.open('picture1.jpg').convert('L'),'f')
print(im.shape,im.dtype)

由结果可以看出每行的第一个元组表示图像数组的大小(行、列、颜色通道),紧接着的字符串表示数组元素的数据类型。

其中灰度图像没有颜色信息,所以在形状元组中,它只有两个数值。

1.3.2 灰度变换

from  PIL import  Image
from numpy import *
from pylab import *
im1=array(Image.open('picture1.jpg').convert('L'))
gray()
im2=255-im1
im3=(100.0/255)*im1+100
im4=255.0*(im1/255.0)**2
subplot(221)
axis('off')
imshow(im1)
subplot(222)
axis('off')
imshow(im2)
subplot(223)
axis('off')
imshow(im3)
subplot(224)
axis('off')
imshow(im4)
show()
print (int(im1.min()),int(im1.max()))

从结果可以看出,第二幅图是将灰度图像进行反相处理的结果,第三幅图是将图像的像素值变换到100-200区间的结果,最后一幅图是对图像进行二次函数变换的结果,使较暗的像素值变得更小。

1.3.3 直方图均衡

直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。

直方图均衡化的变换函数是图像中像素值的累积分布函数( cumulative distribution function, 简写为 cdf,将像素值的范围映射到目标范围的归一化操作)。

def histeq(im,nbr_bins=256):
    #计算图像直方图
    imhist,bins=histogram(im.flatten(),nbr_bins,density=True)
    cdf=imhist.cumsum()#累积分布函数
    cdf=255*cdf/cdf[-1]#归一化
    im2=interp(im.flatten(),bins[:-1],cdf) #使用累积分布函数的线性插值,计算新的像素值
    return im2.reshape(im.shape),cdf

#绘制直方图
from PIL import Image
from pylab import *
im=array(Image.open('picture1.jpg').convert('L'))
im2,cdf=histeq(im)
figure()
gray()
subplot(221)
axis('off')
title(r'before')
imshow(im)
subplot(222)
axis('off')
title(r'after')
imshow(im2)
subplot(223)
hist(im.flatten(),128)
subplot(224)
hist(im2.flatten(),128)
show()

通过输出结果可以看出,直方图均衡化后图像的对比度增强了,原先图像灰色区域的细节变得清晰了。

1.4 SciPy

SciPy是建立在NumPy基础上,用于数值运算的工具包。可以实现数值积分、优化、统计、信号处理,以及图像处理功能。

1.4.1 图像模糊(高斯滤波)

图像的高斯模糊是将灰度图像I和一个高斯核进行卷积操作:其中*表示卷积操作,是标准差为的二维高斯核

from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import gaussian_filter

im=array(Image.open('picture1.jpg'))
subplot(221)
axis('off')
title('before')
imshow(im)
# 不同标准差下进行图像滤波
for n,m in enumerate([2,5,10]):
    # 数组初始化
    im2=zeros(im.shape)
    # 彩色图像高斯滤波
    for i in range(3):
        im2[:,:,i]=gaussian_filter(im[:,:,i],m)
    im2=uint8(im2)
    subplot(2,2,2+n)
    title(f'σ={m}')
    axis('off')
    imshow(im2)
show()

从输出结果可以看出,随着的增加,一幅图像被模糊的程度越大,图像丢失的细节越多。想要模糊彩色图像,对每一个颜色通道进行高斯模糊即可。

猜你喜欢

转载自blog.csdn.net/summer_524/article/details/129282038