今年的目标之一就是图像识别,想把图像处理学习一下,其实图像处理在做毕业设计时就用到过了,只是当初用的是MATLAB,而且只是做车道线识别的简单处理,有点遗憾没跟着院长多学点。好在现在捡起来学也还来得及,这回用的是OpenCV,用Python语言实现。

环境搭建

首先用到的IDE还是pycharm,用anaconda的解释器。打开pycharm,选择设置,在project interpreter里选择anaconda的集成库,因为集成库里没有opencv_python,所以需要额外加入这个库,方法就是在右边有个加号点击添加如下图所示

然后找到opencv_python,选中后安装即可,如果还是显示不了库可以留言。

图片加载

环境搭建好了,就可以开始了,同样新建一个项目,新建Python文件,开始编程。首先吐槽了一下,官方文档比买来的书好多了,买来的书看了大半个月还是懵的,但是看官方的文档一下午就感觉收获好多。先上代码

cv2.imread(图片路径,读取方式)这个函数有两个参数,第一个是要加载图片的存放路径,第二个是要加载图片的方式,有三种方式:

cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数

cv2.IMREAD_GRAYSCALE:以灰度模式读入图像

cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道

三种方式可以用1,0,-1代替。

cv2.namedWindow()这个函数是对图片显示窗口进行设置,一般可以不用。第一个参数是设置窗口名字,第二个参数可以设置成cv2.WINDOW_NORMAL,这样窗口就可以改变大小。

cv2.imshow('', )这个函数也有两个参数引号里面的是显示窗口的名字,第二个参数是要显示的图片。

cv2.waitKey()这个函数是一个键盘绑定函数。传入的是毫秒级的数字,代表在这段时间内,如果键盘没有输入,则函数返回-1,程序继续执行,如果键盘被按下,会返回按键的ASCII 码值,程序将会继续运行,特别的,如果传入的是0,则如果没有按键按下,图片会一直显示,程序也在一直等待,等按键按下程序才会继续运行。

最后cv2.destroyAllWindows()这个函数把全部窗口释放掉,当然也可以只释放单个窗口,用这个函数cv2.namedWindow(),传入想要释放的窗口名就行了。

效果如下,可以调整窗口大小

图片保存

图片说白了就是一个矩阵,是可以进行矩阵运算的,比如上面的程序把img和img1相加混合,当然进行矩阵运算要遵循矩阵运算法则,如彩色图像与黑白图像就不能进行相加,因为维度不一样。

cv2.imwrite('',)这个函数有两个参数,第一个是保存图像的路径、名字以及图片保存成的格式,有jpg,png等,第二个参数是要保存的图像。

效果图,下图第二张是融合的图像

图像的基础知识

图片就是相当于一个矩阵,图片的左上角顶点看做原点,水平为x轴,垂直为y轴,图片上每个像素点都可以用一个坐标表示(x,y)。

图片上的色彩是由每个像素的色彩渲染而成的,OpenCV读图片是按BGR读取的,可以用一个矩阵表示( , , )比如(255,0,0)就代表是全蓝色,每种色彩用0-255代表这种色彩的比例,就像是调色板一样,蓝绿红三种颜色的配比不一样就会呈现不一样的色彩。

上面的图像相加就像是现实中手机相机上的插件,摄像头拍好人脸头像,然后检测出人脸,在头像上加上各种可爱的表情,其实就是用的图像加法。