Python搭建机器学习环境
本文在Python已经搭建好opencv开发环境的情况下,搭建机器学习环境。
Python搭opencv开发环境参考之前文章:http://blog.csdn.net/liyuqian199695/article/details/53561318
1、所需安装包
以上的exe安装文件,直接双击就可以进行安装,并且系统会自动设置安装路径。
机器学习算法大部分是调用Numpy库来完成基础数值计算的。
(1)导入Numpy库
from numpy import * 或者指定导入库的别名:import numpy as np
(2)创建数组
x=np.array([[1.,0.,0.],[0.,1.,2.]]) #创建数组 x.ndim #数组的行数 x.shape #数组的维数,返回格式为(n,m) x.size #数组元素的总数 x.dtype #数组元素的类型 x.itemsize #数组中每个元素占有的字节大小 x.data #数组元素的缓冲区
python命令行演示
a=arange(15).reshape(3,5)
arange函数产生等差序列数组;reshape函数指定形状的新数组。
3、pylab、matplotlib绘图
(1)sin函数绘制
import numpy as np import matplotlib.pyplot as plt x=np.arange(0,5,0.1) y=np.sin(x) plt.plot(x,y) plt.show()
(2)cos函数绘制
import numpy as np import matplotlib.pyplot as plt x=np.arange(0,5,0.1) y=np.cos(x) plt.plot(x,y) plt.show()
-8到8范围的cos函数图像
import numpy as np import matplotlib.pyplot as plt x=np.arange(-8,8,0.1) y=np.cos(x) plt.plot(x,y) plt.show()
3、图像实例
(1)随机生成像素
import numpy as np import cv2 if __name__ == '__main__': sz1 = 200 #行数 sz2 = 300 #列数 print u'产生空图像矩阵(%d*%d) ...' % (sz1, sz2) #产生空图像矩阵,大小为sz1*sz2(行*列) img =np.zeros((sz1, sz2,3), np.uint8) pos1=np.random.randint(200,size=(2000, 1)) #行位置随机数组 pos2=np.random.randint(300,size=(2000, 1)) #列位置随机数组 for i in range(2000): #在随机位置处设置像素点值 img[pos1[i],pos2[i],[0]]=np.random.randint(0,255) img[pos1[i],pos2[i],[1]]=np.random.randint(0,255) img[pos1[i],pos2[i],[2]]=np.random.randint(0,255) cv2.imshow('image', img) #显示图像 cv2.waitKey() #等待按键 cv2.destroyAllWindows() #销毁窗口
运行效果
(2)获取图像大小
import cv2 fn="abc.jpg" #图像名称 if __name__ == '__main__': print 'loading %s ...' % fn img = cv2.imread(fn) #加载图像 sp=img.shape #获取图像矩阵大小 print sp sz1=sp[0] #height sz2=sp[1] #width print 'width:%d\nheight:%d'%(sz2,sz1)
运行结果
(3)图像亮度调节
import cv2 fn="abc.jpg" if __name__ == '__main__': print 'loading %s ...' % fn print u'正在处理中', img = cv2.imread(fn) w=img.shape[1] #图像宽度 h=img.shape[0] #图像高度 ii=0 for xi in xrange(0,w): #将全部色彩变暗 for xj in xrange (0,h): #将像素值整体减少,设为原像素值的20% img[xj,xi,0]= int(img[xj,xi,0]*0.2) img[xj,xi,1]= int(img[xj,xi,1]*0.2) img[xj,xi,2]= int(img[xj,xi,2]*0.2) if xi%10==0 :print '.', cv2.namedWindow('img') cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows() print'' print u'正在处理中' , for xi in xrange(0,w): #将全部色彩变亮 for xj in xrange (0,h): #将像素值整体增加,设为原像素值的1020% img[xj,xi,0]= int(img[xj,xi,0]*10.2) img[xj,xi,1]= int(img[xj,xi,1]*10.2) img[xj,xi,2]= int(img[xj,xi,2]*10.2) if xi%10==0 :print '.', cv2.namedWindow('img1') cv2.imshow('img1', img) cv2.waitKey() cv2.destroyAllWindows()
运行效果
(4)负片与水印效果
负片原理:将像素的三色值设为(255-原值)。
#生成负片 b,g,r=cv2.split(img) #图像分通道 b=255-b g=255-g r=255-r
示例
import cv2 fn="abc.jpg" if __name__ == '__main__': print 'loading %s ...' % fn print u'正在处理中', img = cv2.imread(fn) w=img.shape[1] #图像宽度 h=img.shape[0] #图像高度 ii=0 #生成底片 b, g, r = cv2.split(img) #图像分通道 b=255-b g=255-g r=255-r #直接通过索引改变色彩分量 img[:,:,0]=b img[:,:,1]=g img[:,:,2]=r #加上水印---即在图片上写字 cv2.putText(img,"Hello world", (20,20),cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 123, 0), thickness = 2) cv2.putText(img," machine learning.", (20,100),cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 255, 23), thickness = 2) cv2.namedWindow('img') cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows()
运行结果
(5)图像平铺
import cv2 import numpy as np fn="4.1.07.tiff" if __name__ == '__main__': print 'loading %s ...' % fn print u'正在处理中', img = cv2.imread(fn) w=img.shape[1] #图像宽度 h=img.shape[0] #图像高度 sz1=w*4 #水平平铺4个图像 sz0=h*2 #垂直平铺2个图像 myimg1=np.zeros((sz0,sz1,3), np.uint8) #创建空白图像,然后将图片排列 #逐个像素复制 img_x=0 img_y=0 for now_y in xrange(0,sz0): for now_x in xrange(0,sz1): #复制对应位置的图像像素点 myimg1[now_y,now_x,0]=img[img_y,img_x,0] myimg1[now_y,now_x,1]=img[img_y,img_x,1] myimg1[now_y,now_x,2]=img[img_y,img_x,2] img_x+=1 #增加列数 if img_x>=w: img_x=0 img_y+=1 if img_y>=h: img_y=0 print '.', cv2.namedWindow('img1') cv2.imshow('img1', myimg1) cv2.waitKey() cv2.destroyAllWindows()
运行结果
(6)旋转并平铺图像
import cv2 import numpy as np fn="abc.jpg" if __name__ == '__main__': print 'loading %s ...' % fn print 'working', img = cv2.imread(fn) w=img.shape[1] #图像宽度 h=img.shape[0] #图像高度 sz1=w*2 sz0=h*3 myimg1=np.zeros((sz1,sz0,3), np.uint8) #创建空白图像,然后将图片排列 #翻转并生成图像 img_x=0 img_y=0 for now_y in xrange(0,sz0): for now_x in xrange(0,sz1): myimg1[now_x,now_y,:]=img[img_y,img_x,:] #逐个像素复制 img_x+=1 if img_x>=w: img_x=0 img_y+=1 if img_y>=h: img_y=0 print '.', cv2.namedWindow('img1') cv2.imshow('img1', myimg1) cv2.waitKey() cv2.destroyAllWindows()
运行结果
(7)图像融合
是让两幅原图像对应像素的平均值之和作为新图像像素值。
import cv2
fn1="he1.jpg" fn2="he2.jpg" if __name__ == '__main__': print '...' print 'working', myimg1 = cv2.imread(fn1) myimg2 = cv2.imread(fn2) w=myimg1.shape[1] h=myimg1.shape[0] sz1=w sz0=h #每个像素为2个像素的平均值 for y in xrange(0,sz0): for x in xrange(0,sz1): myimg2[y,x,:]=myimg1[y,x,:]*0.5+myimg2[y,x,:]*0.5 print '.', cv2.namedWindow('img2') cv2.imshow('img2', myimg2) cv2.waitKey() cv2.destroyAllWindows()
运行结果
(8)图像镜像
import cv2 fn="abc.jpg" if __name__ == '__main__': print 'loading %s ...' % fn print '正在处理中', img = cv2.imread(fn) w=img.shape[1] h=img.shape[0] ii=0 #关于纵向生成镜像 # mirror_w=w/2 for j in xrange(0,h): for i in xrange(0,mirror_w): img[j,i,:]=img[j,w-i-1,:] print '.', cv2.namedWindow('img') cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows()
运行结果
4、声音基础
(1)声音波形
声音波形属于正弦波,振幅和频率是其主要特性,振幅就是音量,频率是音调。
# 读取格式信息 # (nchannels, sampwidth, framerate, nframes, comptype, compname) params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes) f.close()
wave_data = np.fromstring(str_data, dtype=np.short) wave_data.shape = -1, 2 wave_data = wave_data.T time = np.arange(0, nframes) * (1.0 / framerate)
import wave import pylab as pl import numpy as np
print 'working...' f = wave.open(r"back.wav", "rb") # 打开WAV文档
# 读取格式信息 # (nchannels, sampwidth, framerate, nframes, comptype, compname) params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4]
# 读取波形数据 str_data = f.readframes(nframes) f.close()
#将波形数据转换为数组 wave_data = np.fromstring(str_data, dtype=np.short) wave_data.shape = -1, 2 wave_data = wave_data.T time = np.arange(0, nframes) * (1.0 / framerate)
# 绘制波形
pl.subplot(211) pl.plot(time, wave_data[0]) pl.subplot(212) pl.plot(time, wave_data[1], c="g") pl.xlabel("time (seconds)") pl.show()
运行结果