Notas de estudio "Programación de visión por computadora en Python"

Capítulo 1 Operación y procesamiento básico de imágenes

1.1 PIL: biblioteca de procesamiento de imágenes de Python

PIL proporciona funciones generales de procesamiento de imágenes, así como operaciones básicas de imágenes, como escalado de imágenes, recorte, rotación, conversión de color, etc. Usando funciones en PIL, los datos pueden leerse desde archivos de formato de imagen y luego escribirse en archivos de formato de imagen.

Conversión de color de imagen: convertir ()

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()

Como puede ver en la salida, la imagen en color se puede convertir en una imagen en escala de grises mediante el método convert('L').

1.1.1 Convertir formato de imagen

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)  # 在工作路径下对文件名重新命名

El método para realizar la conversión por lotes de formato de imagen: 1. Obtenga una lista de todos los nombres de archivo en el directorio raíz donde se encuentra la imagen 2. Segmente el nombre de archivo 3. Convierta el formato de nombre de archivo 4. Actualice la ruta y cambie el nombre de la imagen .

En este experimento, la clave es dividir el nombre del archivo. Utilice el método os.path.splitext(filename) para dividir el nombre del archivo en nombre y sufijo.

1.1.2 Miniaturas, copiar y pegar áreas de imágenes, cambiar el tamaño y rotar imágenes

Miniatura de la imagen: miniatura ()

Este método puede convertir la imagen en una miniatura con el tamaño de parámetro especificado.

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()

Como puede ver en la salida, la imagen original se convierte en una miniatura con un lado más largo de 128 píxeles.

Copie y pegue regiones de imágenes: crop(), paste()

Utilice el método crop() para recortar un área específica de una imagen, que se especifica por cuádruple. Las coordenadas del cuádruple son (izquierda, arriba, derecha, abajo) en orden. La región recortada se puede volver a colocar utilizando el método 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()

Como se puede ver en el gráfico de comparación de resultados, después de recortar el área especificada, se gira 180 grados y se vuelve a colocar. El cuádruple es (500, 500, 1000, 1000).

Redimensionar y rotar: redimensionar(), rotar()

Utilice el método resize() para ajustar la imagen original al tamaño del parámetro especificado y utilice el método giratorio() para girar la imagen original en sentido contrario a las agujas del reloj en el ángulo especificado.

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()

A partir de los resultados de salida, se puede ver que el tamaño de la imagen original se vuelve más pequeño y la imagen original se gira 65 grados en sentido contrario a las agujas del reloj.

1.2 Matplotlib

Matplotlib se puede utilizar para procesar operaciones matemáticas, dibujar gráficos y dibujar puntos, líneas y curvas en imágenes.Es una biblioteca de clases con funciones de dibujo más potentes que PIL. La interfaz de Pylab para Matplotlib contiene muchas funciones para crear gráficos.

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()

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

Supongo que te gusta

Origin blog.csdn.net/summer_524/article/details/129282038
Recomendado
Clasificación