图像处理入门
之前我们已经讲过了OpenCV在各个平台上安装的方法了,从今天开始,正式进入实战部分。首先我们需要做的就是如何读取图像并显示出来,这是图像处理的最基本的部分。
首先我们来了解几个函数:
cv2.imread():
我们看一下函数的原型:
retval=cv.imread(filename[, flags])
retval为自定义名称,filename指代需要加载的文件名,一般情况下,大多数时候,我们是直接加载文件的,所以大多时候我们直接读入图像就可以,但是在一些时候,我们想直接将原图转化为灰度图,从而方便后期的形态学处理操作,那么这个时候第二个参数的意义就表现出来了,第二个参数属于一个标志,它用于指定读取图像的方式。总共有三种方式:
cv.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。
cv.IMREAD_GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
当然了,为了方便起见,它们也可以分别用1,0,-1进行表示。1指代原图也就是第一个函数;0指代第二个函数代表转为灰度图;-1则为第三个函数。
cv2.imshow():
该函数用于在窗口中显示图像,窗口自动适合当前输入的图像尺寸,该函数与imread函数是相辅相成的,该函数原型为:
None=cv.imshow(winname, mat)
None为不需要填写,不用管它,我们直接用imshow就可以,winname是指你输出的图像的名称,可以自定义,但不要用中文名称,否则会乱码;mat则为你需要显示的图像。
此函数之后应是cv2.waitKey()函数,该函数显示指定毫秒的图像。如果不使用waitkey函数,它将不会显示图像。例如,waitKey(0)将无限期显示窗口,直到任何按键为止(适用于图像显示)。 waitKey(25)将显示25毫秒的帧,此后将自动关闭显示。
另一个函数cv2.destroyAllWindows()会销毁我们创建的所有窗口。 如果要销毁任何特定的窗口,请使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。
我们现在来做一个实验,先显示最基本的图像(代码图中都有):
现在我们改变读入的图像为灰度,mread函数的最后一个参数可以进行相关方面的操作,当为0时:
当为1时:
若为-1时:
现在输出的图像的窗口大小是固定的,那么加入我们想要调整窗口的大小,那就需要使用另一个函数,在特殊情况下,我们可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,可以指定窗口是否可调整大小。这是通过功能cv.namedWindow()完成的,现在我们实验一下:
当我们在函数后加一个0,则可以用鼠标手动调整输出图像的大小,这将非常方便。事实上,0对应的参数为cv2.WINDOW_NORMAL,即为自动调整图像,我们大致了解一下相关的参数:
WINDOW_NORMAL或WINDOW_AUTOSIZE: WINDOW_NORMAL可以调整窗口大小,而WINDOW_AUTOSIZE会自动调整窗口大小以适合显示的图像(请参见imshow),并且不能手动更改窗口大小。
WINDOW_FREERATIO或WINDOW_KEEPRATIO: WINDOW_FREERATIO调整图像时不考虑其比例,而WINDOW_KEEPRATIO则保持图像比例。
WINDOW_GUI_NORMAL或WINDOW_GUI_EXPANDED: WINDOW_GUI_NORMAL是绘制没有状态栏和工具栏的窗口的旧方法,而WINDOW_GUI_EXPANDED是新的增强型GUI。默认标志== WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED
假若我们想将处理之后的图像保存起来,保存到文件夹中,那么就需要用到cv2.imwrite函数。
cv2.imwrite():
imwrite函数将图像保存到指定文件。图像格式是根据文件扩展名选择的(扩展名列表请参见cv :: imread)。通常,使用此功能只能保存8位单通道或3通道(具有“ BGR”通道顺序)图像,但以下情况除外:
对于PNG,JPEG 2000和TIFF格式,可以保存16位无符号(CV_16U)图像
可以以PFM,TIFF,OpenEXR和Radiance HDR格式保存32位浮点(CV_32F)图像;使用LogLuv高动态范围编码(每像素4个字节)将保存3通道(CV_32FC3)TIFF图像
使用此功能可以保存带有Alpha通道的PNG图像。为此,创建8位(或16位)4通道图像BGRA,其中alpha通道位于最后。完全透明的像素应将alpha设置为0,完全不透明的像素应将alpha设置为255/65535
该函数原型为:
retval=cv.imwrite(filename, img[, params])
第一个参数是文件名,第二个参数是要保存的图像。现在我们写个综合代码:
import numpy as np import cv2 as cv img = cv.imread('cat.jpg', 0) cv.imshow('image', img) k = cv.waitKey(0) & 0xff if k == 27: # wait for ESC key to exit cv.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv.imwrite('cat.png', img) cv.destroyAllWindows()
在上面的程序中,以灰度加载图像,显示图像,按下键盘的“ s”键保存图像并退出,或者按ESC键直接退出而不保存。我们按下s实验:
图像保存完毕。
那么图像处理的入门部分算是正式结束了,这也是基础中的基础,后续都将非常有用。