《Python》计算机视觉编程

基本的图像操作处理

PIL

目前pycharm使用的是pillow库

from PIL import Image
pil_im =Image.open('empire.jpg')

上述代码的返回值pil_im是一个PIL图像对象

图像的颜色转换可以使用convert()方法来实现。
要读取一幅图像,并将其转换成灰度图像,只需要加上convert(‘L’),如下所示:

pil_im=Image.open('empire.jpg').convert('L')

Matplotlib

绘制图像、点和线

from PIL import Image
from matplotlib import pylab
from pylab import *
#读取图像到数组中
im=array(Image.open('D:\\coder\\randomnumbers\\img\\empire.png'))
#绘制图像
imshow(im)

#一些点
x=[100,100,400,400]
y=[200,500,200,500]

#使用红色星状标记绘制点
plot(x,y,'r*')

#绘制连接前两个点的线
plot(x[:2],y[:2])

#添加标题,显示绘制的图像
title('Plotting:"empire.jpg"')
show()

《Python》计算机视觉编程_第1张图片
也可以选择使坐标轴不显示:

axis('off')

《Python》计算机视觉编程_第2张图片

在绘图时,有很多选项可以控制图像的颜色和样式。

命令 效果
plot(x,y) 默认为蓝色实线
plot(x,y,‘r*’) 红色星状标记
plot(x,y,‘go-’) 带圈圈标记的绿线
plot(x,y,‘ks:’) 带有正方形标记的黑色点线

用Pylab绘图的基本颜色格式命令

#引号为英文单引号 颜色
‘b’ 蓝色
‘g’ 绿色
‘r’ 红色
‘c’ 青色
‘m’ 品红
‘y’ 黄色
‘k’ 黑色
‘w’ 白色

用Pylab绘图的基本线型格式命令

线型
‘-’ 实线
‘–’ 虚线
‘·’ 点线

用Pylab绘图的基本绘制标记格式命令

标记
‘·’
‘o’ 圆圈
‘s’ 正方形
‘*’ 星号
‘+’ 加号
‘x’ 叉号

图像轮廓和直方图

将图像灰度化:

from PIL import Image
from pylab import *

#读取图像到数组中
im=array(Image.open('D:\\coder\\randomnumbers\\img\\empire.png').convert('L'))

#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
show()


《Python》计算机视觉编程_第3张图片
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。
该(灰度)图像的直方图可以使用hist()函数绘制:

figure()
hist(im.flatten(),128)
show()

《Python》计算机视觉编程_第4张图片

《Python》计算机视觉编程_第5张图片

Numpy

灰度变换

from PIL import Image
from numpy import *
from PIL import Image
from matplotlib import pylab
from pylab import *
im = array(Image.open('D:\\coder\\randomnumbers\\img\\empire.png').convert('L'))
im2 =255-im #对图像进行反向处理
im3 =(100.0/255)*im+100 #将图像像素值变换到100...200之间
im4 =255.0*(im/255.0)**2 #对图像像素值求平方后得到的图像
print(int(im.min()),int(im.max()))
print(int(im2.min()),int(im2.max()))
print(int(im3.min()),int(im3.max()))
print(int(im4.min()),int(im4.max()))

imshow(im3)
show()

输出:

0 255
0 255
100 200
0 255

《Python》计算机视觉编程_第6张图片
《Python》计算机视觉编程_第7张图片

Scipy

图像模糊

from PIL import Image
from numpy import *
from scipy.ndimage import filters
im =array(Image.open('D:\\coder\\randomnumbers\\img\\empire.png').convert('L'))
im2 =filters.gaussian_filter(im,5)

上面guassian_filter()函数的最后一个参数表示标准差
《Python》计算机视觉编程_第8张图片

图像导数

from PIL import Image
from pylab import *
from numpy import *
from scipy.ndimage import filters
im =array(Image.open('D:\\coder\\randomnumbers\\img\\empire.png').convert('L'))
#Sobel导数滤波器
imx=zeros(im.shape)
filters.sobel(im,0,imx)

imy=zeros(im.shape)
filters.sobel(im,1,imy)


magnitude=sqrt(imx**2+imy**2)
imshow(imx)
#imshow(imy)
#imshow(magnitude)


show()

《Python》计算机视觉编程_第9张图片
《Python》计算机视觉编程_第10张图片

《Python》计算机视觉编程_第11张图片

计算视差图

下面是扫平面法的具体实现代码,该函数返回每个像素的最佳视差。

def plane_sweep_ncc(im_l,im_r,start,steps,wid):  #使用归一化的互相关计算视差图像
  m,n=im_l.shape
  
  #保存不同求和值的数组
  mean_l=zeros((m,n))
  mean_r=zeros((m,n))
  s=zeros((m,n))
  s_l=zeros((m,n))
  s_r=zeros((m,n))
  
  #保存深度平面的数组
  dmaps=zeros((m,n,steps))
  
  #计算图像块的平均值
  filters.uniform_filter(im_l,wid,mean_l)
  filters.uniform_filter(im_r,wid,mean_r)
  
  #归一化图像
  norm_l=im_l-mean_l
  norm_r=im_r-mean_r
  
  #尝试不同的视差
  for displ in range(steps):
     #将左边图像移动到右边,计算加和
     filters.uniform_filter(roll(norm_l,-displ-start)*norm_r,wid,s) #和归一化
     filters.uniform_filter(roll(norm_l,-displ-start)*roll(norm_l,-displ-start),wid,s)
     filters.uniform_filter(norm_r*norm_r,wid,s_r) #和反归一化
     
     #保存ncc的分数
     dmaps[:,:,displ]=s/sqrt(s_l*s_r)
     return argmax(dmaps,axis=2)
     

下面是载入图像,并使用该函数计算偏移图的完整例子:

import stereo

im_l=array(Image.open('scene1.row3.col3.ppm').convert('L'),'f')

im_r=array(Image.open('scene1.row3.col4.ppm').convert('L'),'f')

#开始偏移,并设置步长
steps=12
start=4

#ncc的宽度
wid=9
res = stereo.plane_sweep_ncc(im_l,im_r,start,steps,wid)

import scipy.misc
scipy.misc.imsave('depth.png',res)

图像聚类

你可能感兴趣的:(机器学习,python,计算机视觉,开发语言)