Python计算机视觉——基本图像操作和处理

文章目录

  • 图像基本操作
    • 读取并显示图像
    • 创建图像缩略图
    • 复制和粘贴图像区域
    • 调整尺寸和旋转
    • 绘制图像、点和线
  • 图像轮廓和直方图
    • 图像轮廓
    • 图像直方图
      • 基本原理
      • 绘制方法
  • 灰度变换
  • 直方图均衡化
    • 基本原理
    • 实现过程
  • 高斯滤波
    • 基本原理
    • 实现过程

图像基本操作

读取并显示图像

在读取图像时,我们可以使用PIL(Python Imaging Library, 图像处理类库)中的函数进行操作,PIL中最重要的模块为Image,要读取一幅图像,我们可以使用Image.open进行操作。

from PIL import Image
pil_im = Image.open('./pic.jpg')
pil_im.show()

运行结果:
Python计算机视觉——基本图像操作和处理_第1张图片
若要对读取的图像进行颜色转换,则可以通过convert()方法实现,比如我们要将读取的图像转换为灰度图,则只需加上convert(‘L’)。

pil_im = Image.open('./pic.jpg').convert('L') #转化为灰度图
pil_im.show()

运行结果:
Python计算机视觉——基本图像操作和处理_第2张图片

创建图像缩略图

使用PIL同样可以方便的创建图像的缩略图,只需使用thumbnail()方法,再添加参数指定生成缩略图的大小。

#创建缩略图
pil_im = Image.open('./pic.jpg')
pil_im.thumbnail((128,128))
pil_im.show()

运行结果:
Python计算机视觉——基本图像操作和处理_第3张图片

复制和粘贴图像区域

若要对图像中的指定区域进行裁剪,则需使用crop()方法,我们通过四元组来指定需裁剪的区域,四元组坐标依次为(左,上,右,下),在PIL中指定坐标系的左上角坐标为(0,0),在裁剪完指定区域后,我们可以将该区域进行旋转然后用paste()方法粘贴回原处。

#复制和粘贴图像区域
pil_im = Image.open('./pic.jpg')
box=(100,100,400,400)
region = pil_im.crop(box) #使用crop函数进行裁剪
# region.show()
region = region.transpose(Image.ROTATE_180)#将所裁剪区域进行旋转
pil_im.paste(region,box)#粘贴回原区域
# region.show()
pil_im.show()

运行结果:
Python计算机视觉——基本图像操作和处理_第4张图片

调整尺寸和旋转

若要将整幅图像进行尺寸的调整,则需使用resize()方法,填写参数即可将图像调整至所需大小,而要旋转图像,则可以使用rotate()方法,该方法是使用逆时针方式进行旋转。

# 调整尺寸和旋转
# 采用resize方法进行尺寸调整
pil_im = Image.open('./pic.jpg')
out = pil_im.resize((128,128))
figure()
subplot(121)
axis('off')
title(r'resize')
imshow(out)
out = pil_im.rotate(45)#用rotate方法进行旋转(逆时针)
subplot(122)
axis('off')
title(r'rotate')
imshow(out)
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第5张图片

绘制图像、点和线

PIL提供了通用的图像处理功能,但当我们需要自定义绘制图表时,则需用到Matplotlib,该类库具有比PIL更强大的绘图功能。

from PIL import Image
from pylab import *
from numpy import *
#绘制图像、点和线
im = array(Image.open('./pic.jpg'))
#绘制图像
imshow(im)
#一些点
x=[100,100,400,400]
y=[200,500,200,500]
#使用红色星状标记绘制点
plot(x,y,'r*')
#圆圈标记绿线
# plot(x,y,'go-')
#带有正方形标记的黑色点线
# plot(x,y,'ks:')
#绘制连接前两个点的线
plot(x[:2],y[:2],)
#添加标题,显示绘制图像
title('plotting:"pic.jpg"')
#不显示坐标轴
axis('off')
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第6张图片
如图所示,我们可以在图像上绘制点和线,也可以设置坐标轴和标题等,另外我们也可以对图像的颜色和样式等进行设置,如下图所示,我们对点和线进行颜色和样式的变换。
Python计算机视觉——基本图像操作和处理_第7张图片
Python计算机视觉——基本图像操作和处理_第8张图片

图像轮廓和直方图

图像轮廓

在绘制图像轮廓前需要对图像灰度化。

#读取图像并转化为灰度图
im=array(Image.open('./pic.jpg').convert('L'))
#不使用颜色信息
gray()
# 在原点左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
imshow(im)
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第9张图片

图像直方图

基本原理

图像直方图可以用来表示图像像素值的分布情况。用一定数目的小区间来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。即直方图统计了一幅图像中每个像素值(亮度值)的像素个数,同时图像直方图还具有图像平移、旋转、缩放不变性等众多优点。

绘制方法

在绘制灰度图像的直方图时,我们可以使用hist()函数进行绘制,由于hist()只接受一维数组作为输入,因此在绘制直方图之前需将图像进行压平处理,通过flatten()方法将任意数组按照行优先准则转换成一维数组。

#读取图像并转化为灰度图
im=array(Image.open('./pic.jpg').convert('L'))
#不使用颜色信息
gray()
#绘制直方图
hist(im.flatten(),128)
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第10张图片
绘制图像轮廓和直方图

#图像轮廓和直方图
#读取图像并转化为灰度图
im=array(Image.open('./pic.jpg').convert('L'))
#新建一个图像
figure()
subplot(121)
#不使用颜色信息
gray()
# 在原点左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
imshow(im)
subplot(122)
#绘制直方图
hist(im.flatten(),128)
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第11张图片

灰度变换

在将图像读入Numpy数组对象后,我们就可以对其执行任意数学操作,比如灰度变换,我们可以对图像进行反相处理,将图像像素值变换到100到200区间,将图像像素值进行平方等等。

#灰度变换
im=array(Image.open('./pic.jpg').convert('L'))
im2=255-im #反相处理
im3=(100.0/255)*im+100 #将图像像素值变换到100到200区间
im4=255.0*(im/255.0)**2 #对图像像素值求平方后得到的图像
pil_im=Image.fromarray(uint8(im))
figure()
gray()
subplot(221)
axis('off')
title(r'before')
imshow(im)
subplot(222)
axis('off')
title(r'$f(x)=255-x$')
imshow(im2)
subplot(223)
axis('off')
title(r'$f(x)=\frac{100}{255}x+100$')
imshow(im3)
subplot(224)
axis('off')
title(r'$f(x)=255(\frac{x}{255})^2$')
imshow(im4)
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第12张图片

直方图均衡化

基本原理

直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率相同,即将图像中像素个数较多的灰度值进行展平,将像素个数较少的灰度值进行合并,把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,这样就可以增强整幅图像的对比度。

实现过程

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

#绘制直方图
im=array(Image.open('./pic.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()

运行结果:
Python计算机视觉——基本图像操作和处理_第13张图片

高斯滤波

基本原理

图像的高斯模糊就是将图像I与一个高斯核进行卷积操作:
I σ = I ∗ G σ I_\sigma=I*G_\sigma Iσ=IGσ
其中*表示卷积操作, G σ G_\sigma Gσ表示标准差为 σ \sigma σ的二维高斯核,定义为:
G σ = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 G_\sigma=\frac{1}{2\pi\sigma^2}e^{-\frac{(x^2+y^2)}{2\sigma^2}} Gσ=2πσ21e2σ2(x2+y2)
σ \sigma σ的值越大,图像模糊程度越大。
高斯滤波是一种线性平滑滤波,即高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

实现过程

#图像高斯模糊
im=array(Image.open('./pic.jpg'))
figure()
subplot(221)
axis('off')
title(r'before')
imshow(im)
for n,sigma in enumerate([2,5,10]):
    im2=zeros(im.shape)
    for i in range(3):
        im2[:,:,i]=filters.gaussian_filter(im[:,:,i],sigma)
    im2=np.uint8(im2)
    subplot(2,2,2+n)
    axis('off')
    s = str(sigma)
    title(r'σ='+s)
    imshow(im2)
show()

运行结果:
Python计算机视觉——基本图像操作和处理_第14张图片
在该部分实现过程当中,我们用到了enumerate()函数,因为如果不使用该函数的话,我们需要每次都更改σ值,然后再分别输出进行效果的对比,这样较为繁琐。而使用enumerate()函数的话,该函数优点是既可以得到索引值又可以遍历元素,这样我们就可以通过enumerate()函数遍历σ值实现不同σ值下对应的高斯模糊效果,另外得到的索引值还可以用于subplot当中,便于显示图像,如我要在窗口中显示2*2的四幅图像,我先将原图显示,然后后面的图像分别为subplot(222),subplot(223),subplot(224),由于我们测试了三个σ值,因此可以得到索引值为0,1,2,我们就可以将subplot(2,2,2+n)放入循环当中,这样循环测试不同σ值时就可以将对应的效果图进行显示。

你可能感兴趣的:(python,计算机视觉,图像处理)