OpenCV学习笔记之二:图像处理中常用的函数介绍

一、imread

Mat imread(const String& filename,int flags = IMREAD_COLOR);

返回Mat对象;

参数filename: 待打开图片的绝对地址,需要注意的是,并不是所有文件都可以用它打开,它支持的文件如下;函数识别不是依靠文件的后缀名,而是依靠内容的编码格式;

需要注意的是imread读取数据时会重新排列数据。

  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)
  • JPEG 2000 files - *.jp2 (see the Notes section)
  • Portable Network Graphics - *.png (see the Notes section)
  • WebP - *.webp (see the Notes section)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Notes section)
  • OpenEXR Image files - *.exr (see the Notes section)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by Gdal (see the Notes section)

参数flags:打开的参数,这个非常重要,因为如果设置不合适的话,很容易出现预想之外的效果。它可以指导将原图读取时进行一定的转换。默认值是IMREAD_LOAD_GDAL。因此,如果是想直接处理原图,应该设置为IMREAD_UNCHANED。

常用的一般是下面三种

  • IMREAD_UNCHANGED 保持原来的图像
  • If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
  • IMREAD_GRAYSCALE 灰度图像
  • If set, always convert image to the single channel grayscale image.
  • IMREAD_COLOR 彩色图像
  • If set, always convert image to the 3 channel BGR color image.

当然为了简单起见,我们可以用数字设置,如果写为1最后输出就显示原图,如果写为0,最后输出就显示灰度图。

二、imshow

cv2.imShow(const string& winname, InputArray mat)

函数可以在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。

  •  第一个参数,const string&类型的winname,填需要显示的窗口标识名称。
  •  第二个参数,InputArray 类型的mat,填需要显示的图像。

imshow 函数用于在指定的窗口中显示图像。如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度: 

  • 如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。
  • 如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是说,值的范围是[0,255 x 256]映射到[0,255]。
  • 如果图像是32位浮点型(32-bit floating-point),像素值便要乘以255。也就是说,该值的范围是[0,1]映射到[0,255]。

三、waitKey

cv2.waitKey(ms)

是一个和键盘绑定的函数,它的作用是等待一个键盘的输入(因为我们创建的图片窗口如果没有这个函数的话会闪一下就消失了,所以如果需要让它持久输出,我们可以使用该函数)。它的参数是毫秒级。该函数等待任何键盘事件的指定毫秒。Ms=0如果您在此期间按下任何键,程序将继续进行。我们也可以将其设置为一个特定的键。

四、destroyALLWindows

cv2.destroyWindow()

销毁我们创建的所有窗口。如果要销毁任何特定窗口,请使用函数cv2.destroyWindow(),其中传递确切的窗口名称作为参数。(应该是使用创建窗口时所使用的窗口名称,字符串类型。)

五、namedWindow

顾名思义,namedWindow函数,用于创建一个窗口。函数原型是这样的:

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );  

第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。

第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:

  • WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
  • WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
  • WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。

函数剖析:

  1. 首先需要注意的是,它有默认值WINDOW_AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。
  2. namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。
  3. 我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。
  4. 但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。

六、imwrite

在OpenCV中,输出图像到文件,我们一般都用imwrite函数,它的声明如下:

bool imwrite(const string& filename,InputArray img, const vector& params=vector() );  

  • 第一个参数,const string&类型的filename,填需要写入的文件名就行了,带上后缀,比如,“123.jpg”这样。
  • 第二个参数,InputArray类型的img,一般填一个Mat类型的图像数据就行了。
  • 第三个参数,const vector&类型的params,表示为特定格式保存的参数编码,它有默认值vector(),所以一般情况下不需要填写。

七、split

b,g,r=cv2.split(img)

我之前说过彩色图像是由BGR三个通道组成的,也就是三个0-255的数组

如果把彩色图片拆分后,那么得到的应该是三张灰色图像

八、merge

BGR=cv2.merge([b,g,r])

与split恰恰相反,把三个通道的颜色合成图像

九、addWeighted

addWeighted( src1, alpha, src2, beta, 0.0, dst)

  • 第1个参数,输入图片1,
  • 第2个参数,图片1的融合比例
  • 第3个参数,输入图片2
  • 第4个参数,图片2的融合比例
  • 第5个参数,偏差,不能省略
  • 第6个参数,输出图片,可选

计算的方式如下:

OpenCV学习笔记之二:图像处理中常用的函数介绍_第1张图片

十、CvtColor

函数形式: void cvCvtColor( const CvArr* src, CvArr* dst, int code );

参数列表:

src:源图像(输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像)

dst:目标图像(输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像)

code:转换代码

  • 彩色转换灰度:COLOR_BGR2GRAY
  • BGR转换RGB:COLOR_BGR2RGB
  • 灰度转彩色:COLOR_GRAY2BGR

十一、resize

  1. cv2.resize(scr,dsize);

scr:原始图像

dsize:缩放的大小,(a,b)a是代表有多少列,b代表多少行

  2.   cv2.resize(scr,dsize,fx,fy);

scr:原始图像

dsize为空时,fx,fy表示缩放为原来的倍数(可以小于1)

十二、flip

flip(src,flipCode);

src:原始图像

flipCode:

  • =0:上下翻转
  • >0:左右翻转
  • <0:先水平上下翻转再左右翻转

十三、threshold

ret, dst = cv2.threshold(src, thresh, maxval, type)

src: 输入图,只能输入单通道图像,通常来说为灰度图

dst: 输出图

thresh: 阈值=ret,一般情况指定128

maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转
  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

十四、boxFilter

boxFilter(原始图像,目标图像深度,核大小,normalize属性);

  • 目标图像深度一般为-1,表示与原始图像保持一致
  • 核大小就是对周围取值的范围
  • normalize属性:是否进行归一化处理,归一化代表取均值=均值滤波;不进行归一化的话就是取和,容易溢出,就是和很容易大于255

十五、GaussianBlur

GaussianBlur(str,ksize,sigmax)

str:原始图像

ksize:核大小,必须是奇数

sigmax:X方向的方差,控制权重,一般取0,自动根据核大小计算

十六、medianBlur

相当于用中值代替

medianBlur(img, Ksize)

Ksize:核大小,必须是大于1的奇数

十七、erode

cv2.erode(scr,kernel,iterations)

scr:原始图像

kernel:卷积核,正方形,生成方式np.ones((5,5),np.uint8)

iteration:迭代次数,默认为1

十八、dilate

cv2.dilate(scr,kernel,iterations)

scr:原始图像

kernel:卷积核,正方形,生成方式np.ones((5,5),np.uint8)

iteration:迭代次数,默认为1

十九、morphologyEx

开运算就是先腐蚀再膨胀,去掉噪声在还原

cv2.morphologyEx(img,cv2.MORPH_OPEN, kernel)

cv2.MORPH_OPEN:开运算

 

闭运算先膨胀再腐蚀

cv2.morphologyEx(img,cv2.MORPH_CLOSE, kernel)

cv2.MORPH_CLOSE:闭运算

 

梯度操作

梯度=膨胀-腐蚀

得到图像轮廓

cv2.morphologyEx(img,cv2.MORPH_GRADIENT, kernel)

cv2.MORPH_GRADIENT:梯度操作

 

礼帽操作

礼帽操作=原始图像-开运算图像

最终得到的就是噪声

cv2.morphologyEx(img,cv2.MORPH_TOPHAT, kernel)

cv2.MORPH_TOPHAT:礼帽操作

 

黑帽操作

黑帽操作=闭运算-原始输入

最终得到的就是噪声

cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)

cv2.MORPH_BLACKHAT:黑帽操作

你可能感兴趣的:(计算机视觉)