当前位置:   article > 正文

《Python》计算机视觉编程_python计算机视觉编程

python计算机视觉编程

基本的图像操作处理

PIL

目前pycharm使用的是pillow库

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

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

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

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

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述
也可以选择使坐标轴不显示:

axis('off')
  • 1

在这里插入图片描述

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

命令效果
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()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。
该(灰度)图像的直方图可以使用hist()函数绘制:

figure()
hist(im.flatten(),128)
show()
  • 1
  • 2
  • 3

在这里插入图片描述

在这里插入图片描述

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出:

0 255
0 255
100 200
0 255

  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
在这里插入图片描述

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)
  • 1
  • 2
  • 3
  • 4
  • 5

上面guassian_filter()函数的最后一个参数表示标准差
在这里插入图片描述

图像导数
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

计算视差图

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

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)
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

图像聚类

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/648957
推荐阅读
相关标签
  

闽ICP备14008679号