目前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')
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()
axis('off')
在绘图时,有很多选项可以控制图像的颜色和样式。
命令 | 效果 |
---|---|
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()
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。
该(灰度)图像的直方图可以使用hist()函数绘制:
figure()
hist(im.flatten(),128)
show()
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
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()函数的最后一个参数表示标准差
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()
下面是扫平面法的具体实现代码,该函数返回每个像素的最佳视差。
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)