0
点赞
收藏
分享

微信扫一扫

基本的图像操作和处理【计算机视觉第一章】

一.PIL:Python图像处理库

PIL(Python Imaging Library,图像处理库),提供通用的图像处理功能,有大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。下面将具体举例一些PIL基本图像操作。

1.读取一副图像并显示

from PIL import Image
im = Image.open('image/car.png')   #打开原图
im.show()        #显示原图

2.图像颜色转换convert()方法

convert中可设置转换模式,介绍比较常用的三种模式:RGB模式:有红(R)、绿(G)、蓝(B)三个颜色通道的变化;1模式:转化为为二值图像,非黑即白,每个像素用8个bit表示,0表示黑,255表示白;L模式:转化为为灰色图像,每个像素用8个bit表示,0表示黑,255表示白,0~255代表不同的灰度。需要注意的是,在PIL中,RGB是通过以下公式转化为L的:L = R * 299/1000 + G * 587/1000 + B * 114/1000

im_gray = im.convert('L')     #转化为灰度图像,其他模式:im.convert('1')  im.convert('RGB')  
im_gray.show()         #显示灰度图像

 3.调整图像尺寸和旋转

im_small = im.resize((200,200))  #调整图像尺寸大小 该方法的参数是元组
im_small.show()

im_rotate = im.rotate(45)  #以逆时针方式旋转图片45度
im_rotate.show()

 

 4.创建缩略图

im_tn=im.thumbnail((200,200))   #thumbnail()方法接受一个元组参数(该参数指定生成缩略图的大小),然后将图像转换成符合元组参数指定大小的缩略图。

5.复制和粘贴图像区域

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

box = (50,50,100,100)
region = im.crop(box)
region.show()

 剪切区域用四元组指定,四元组的坐标依次是(左,上,右,下),接下来我们旋转上面的区域并用paste()放回

region = region.transpose(Image.ROTATE_180)
im.paste(region,box)
im.show()

 6.读入一张图像并用save()方法保存图片

im = Image.open("image/car.png") 
im.save("image/sun.jpg")

二.Matplotlib: 是Python中类似 MATLAB 的绘图工具

Matplotlib具有比PIL更强大的绘画功能,能绘制出高质量的图表,其中的PyLab接口包含很多方便用户创建图形的函数,常在计算机视觉中应用。下面绘制一个简单的图表例子。

from PIL import Image
import numpy as np
from pylab import *

#读取图像到数组中
im =array(Image.open("image/car.png"))

#绘制图像
imshow(im)

#绘制的点
x =[50,50,200,200]
y =[100,200,300,200]

#使用红色星状标记绘制的点
plot(x,y,'r*')  #'go-'带圆圈标记的绿线 'ks:' 带正方形标记的黑点线 

#连接所有点
plot(x[:4],y[:4])

#坐标轴不显示
#axis('off')

#添加标题,显示绘制的图像
title('sun.png')
show()

 1.绘制图像轮廓和直方图

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

from PIL import Image
import numpy as np
from pylab import *

#读取图像到数组中
im =array(Image.open("image/car.png").convert('L'))

#新建一个图像
figure()

#不使用颜色信息
gray()

#在原点的左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
show()

图像的直方图用来表征该图像像素值的分布情况,可以用hist()函数绘制,需要注意的是hist()函数只接受一维数组作为输入,所以必须对输入灰度图像进行压平处理,这里使用flatten()方法进行压平处理,flatten()方法能将任意数组按照行优先准则转换成一维数组。

from PIL import Image
import numpy as np
from pylab import *
im =array(Image.open("image/car.png").convert('L'))
figure()
hist(im.flatten(),128)
show()

 

 2.直方图的均衡化

直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。
 

from PIL import Image
import numpy as np
from pylab import *
#显示原图
im1=Image.open("image/car.png").convert('L')
im1.show()

im =array(Image.open("image/car.png").convert('L'))
#计算图像直方图
figure(1)
hist(im.flatten(),128)
#show()
imhist,bins=histogram(im.flatten(),256)
cdf=imhist.cumsum()    #累积分布函数
cdf=255*cdf/cdf[-1]    #归一化

#使用累积分布函数的线性插值,计算新的像素值
im2=interp(im.flatten(),bins[:-1],cdf)
figure(2)
hist(im2,128)

img = im2.reshape(im.shape)
img = Image.fromarray(img)
img.show()
figure(3)
plot(cdf, color = 'b')
title("transfer function")
show()

原图像直方图                                              均衡化直方图

原图像                                                      均衡化图像                                        变换函数

 3.PIL的滤波_ImageFilter

 当前的PIL版本中ImageFilter模块支持十种滤波器:

1. BLUR模糊滤波

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
im.show()
img= im.filter(ImageFilter.BLUR)
img.show()

 原图

模糊滤波之后的图像

 2.CONTOUR轮廓滤波,将图像中的轮廓信息全部提取出来

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
im.show()
img= im.filter(ImageFilter.CONTOUR)
img.show()

 3.DETAIL为细节增强滤波,会使得图像中细节更加明显。

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
im.show()
img= im.filter(ImageFilter.DETAIL)
img.show()

 4.EDGE_ENHANCE为边缘增强滤波

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.EDGE_ENHANCE)
img.show()

 5.EDGE_ENHANCE_MORE为深度边缘增强滤波,会使得图像中边缘部分更加明显

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.EDGE_ENHANCE_MORE)
img.show()

 

6.EMBOSS为浮雕滤波,会使图像呈现出浮雕效果

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png").convert('L')
img= im.filter(ImageFilter.EMBOSS)
img.show()

 

7.FIND_EDGES为寻找边缘信息的滤波,会找出图像中的边缘信息

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png").convert('L')
img= im.filter(ImageFilter.FIND_EDGES)
img.show()

 

8.SMOOTH为平滑滤波,突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.SMOOTH)
img.show()

 

9.SMOOTH_MORE为深度平滑滤波,会使得图像变得更加平滑

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.SMOOTH_MORE)
img.show()

 

10.SHARPEN为锐化滤波,补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。

from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.SHARPEN)
img.show()

 

总结

PIL库可以完成图像归档和图像处理两方面功能需求:

图像归档:对图像进行批处理、生成图像预览、图像格式转换等;

图像处理:图像基本处理、像素处理、颜色处理等。

在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法。

 

 

 

 

举报

相关推荐

0 条评论