Python计算机视觉编程第一章——基本的图像操作和处理

本文介绍了Python中处理图像的基础操作,涵盖PIL库的图像格式转换、缩略图创建、复制粘贴区域、尺寸调整与旋转等;Matplotlib的图像绘制、轮廓与直方图;NumPy的图像数组表示、灰度变换、直方图均衡化和PCA;以及SciPy的图像模糊和导数计算。示例代码展示了如何实现这些操作,并讨论了其在图像处理中的应用。
摘要由CSDN通过智能技术生成

基本的图像操作和处理

(一)PIL:Python 图像处理类库

PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能, 以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。虽然PIL是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。

下面介绍PIL Image类中常用的函数:

open(filename,mode)                                           #读取一张图像

convert(mode,matrix,dither,palette,colors)          #图像的颜色转换

编写代码:

from PIL import Image
from pylab import *
pil_im = Image.open('D:\\Python\\chapterone\\dog.jpg')
gray()
subplot(131)
title('(a)')
axis('off')
imshow(pil_im)
pil_i = Image.open('D:\\Python\\chapterone\\dog.jpg').convert('L')        #图像转换为灰度图像
subplot(132)
title('(b)')
axis('off')
imshow(pil_i)
im_rgb = pil_i.convert("RGB")       #灰度图像转换为RGB图像
subplot(133)
title('(c)')
axis('off')
imshow(im_rgb)
show()

代码运行效果如下:

分析:

convert方法可以改变图像的mode,一般是在’RGB’(真彩图)、‘L’(灰度图)、‘CMYK’(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的。

1.1 转换图像格式

通过 save() 方法,PIL 可以将图像保存成多种格式的文件。

函数:

save(filename,format)

编写代码:

from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\dog.jpg', "r")
dog = im.save('D:\\Python\\chapterone\\dog.png', 'png')
dog.show()

代码运行效果如下:

分析:

上面的代码将jpg图像重新保存成png格式。注意,保存文件的文件名很重要,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。

1.2 创建缩略图

Image 类的 thumbnail() 方法可以用来制作缩略图。它接受一个二元数组作为缩略图的尺寸,然后将示例缩小到指定尺寸。

函数:

thumbnail(size,resample)

thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。

编写代码:

from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
subplot(121)
title('(a)')
axis('off')
imshow(im)

im.save('D:\\Python\\chapterone\\flower5.png', 'png')
im.thumbnail((128, 128), resample=Image.BICUBIC)
subplot(122)
title('(b)')
axis('off')
imshow(im)
show()

代码运行效果如下:

编写代码:

from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
im.save('D:\\Python\\chapterone\\flower5.png', 'png')
im.show()
im.thumbnail((128, 128), resample=Image.BICUBIC)
im.show()

代码运行效果如下:

分析:

从第一幅图可以看出,创建最长边为 128 像素的缩略图,图像在同样大小的情况下展示,会变得模糊,从第二幅图可以看出,正常情况下展示指定像素的缩略图,图像会变小。

1.3 复制和粘贴图像区域

使用 crop() 方法可以从一幅图像中裁剪指定区域:

函数:

crop(box)

编写代码:

from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
subplot(121)
title('(a)')
axis('off')
imshow(im)

box = (100,500,400,700)
subplot(122)
title('(b)')
axis('off')
imshow(im.crop(box))
show()

代码运行效果如下:

分析:

上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。

paste() 方法则可以将一个 Image 示例粘贴到另一个 Image 示例上。

函数:

paste(region,box,mask)

编写代码:

from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
subplot(131)
title('(a)')
axis('off')
imshow(im)

box = (100,500,400,700)
subplot(132)
title('(b)')
axis('off')
imshow(im.crop(box))

region = im.crop(box)
im.paste(region,(300,200),None)
subplot(133)
title('(c)')
axis('off')
imshow(im)
show()

代码运行效果如下:

分析:

上面的代码将region图像粘贴到左上角为(300,200)的位置(也就是雏菊图像的右上角)。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被转换成和region一样的size。

1.4 调整尺寸和旋转

transpose() 方法可以将图片左右颠倒、上下颠倒、旋转 90°、旋转 180° 或旋转 270°

函数:

transpose(method)                #method表示选择什么样的翻转或者旋转方式

编写代码:

from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\lovely2.jpg', "r")
subplot(331)
title('(a)')
axis('off')
imshow(im)

Image.FLIP_LEFT_RIGHT = im.transpose(Image.FLIP_LEFT_RIGHT)
subplot(332)
title('(b)')
axis('off')
imshow(Image.FLIP_LEFT_RIGHT)

Image.FLIP_TOP_BOTTOM = im.transpose(Image.FLIP_TOP_BOTTOM)
subplot(333)
title('(c)')
axis('off')
imshow(Image.FLIP_TOP_BOTTOM)

Image.ROTATE_45 = im.rotate(45)
subplot(334)
title('(d)')
axis('off')
imshow(Image.ROTATE_45)

Image.ROTATE_90 = im.transpose(Image.ROTATE_90)
subplot(335)
title('(e)')
axis('off')
imshow(Image.ROTATE_90)

Image.ROTATE_180 = im.transpose(Image.ROTATE_180)
subplot(336)
title('(f)')
axis('off')
imshow(Image.ROTATE_180)

Image.ROTATE_270 = im.transpose( Image.ROTATE_270)
subplot(337)
title('(g)')
axis('off')
imshow( Image.ROTATE_270)

Image.TRANSPOSE = im.transpose(Image.TRANSPOSE)
subplot(338)
title('(h)')
axis('off')
imshow(Image.TRANSPOSE)

Image.TRANSVERSE = im.transpose(Image.TRANSVERSE)
subplot(339)
title('(i)')
axis('off')
imshow(Image.TRANSVERSE)

show()

代码运行效果如下:

分析:
( b ) Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
( c ) Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
( d ) rotate(45),表示将图像逆时针旋转45°
( e ) Image.ROTATE_90,表示将图像逆时针旋转90°
( f ) Image.ROTATE_180,表示将图像逆时针旋转180°
( g ) Image.ROTATE_270,表示将图像逆时针旋转270°
( h ) Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
( i ) Image.TRA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值