Opencv_Python学习笔记--OpenCV中的GUI特性

来源:互联网 发布:golang mgo id 编辑:程序博客网 时间:2024/06/15 18:43

主要函数:

cv2.imread()cv2.imshow()cv2.waitKey()cv2.namedWindow()cv2.destroyAllWimows()

1.读入图像

cv2.imread()其中包括两个参数:
(1)读取图像文件的绝对路径;
(2)读取图像文件的模式。

如:cv2.imread(r"E:\PythonImage\Image1.jpg",0)
这段代码的意思是,读取位于E盘的PythonImage文件夹下的图像文件Image1.jpg,并将图像转换成灰度显示出来。
第二个参数取值为:

CV_LOAD_IMAGE_UNCHANGED = -1CV_LOAD_IMAGE_GRAYSCALE = 0CV_LOAD_IMAGE_COLOR = 1CV_LOAD_IMAGE_ANYDEPTH = 2CV_LOAD_IMAGE_ANYCOLOR = 4

可以参考:http://blog.csdn.net/poem_qianmo/article/details/20537737
赋值时,可以给定需求的语句,也可以给定语句对应的整数。

2.显示图像

cv2.imshow()函数也包含两个参数:
(1)窗口名字,为String类型;
(2)需要显示的图像的变量名。
例如,

img = cv2.imread(r"E:\PythonImage\Image1.jpg")cv2.imshow("ImageDisplay",img)cv2.waitKey(0)cv2.destroyAllWindows()

应用以上代码,我们可以将位于E盘目录下的图像在名为ImageDsiplay的窗口中显示出来,其中cv2.waitKey()cv2.destroyAllWindows()函数分别有以下作用:

cv2.waitKey()函数的参数为等待的时间,也就是图像显示的时间,单位是毫秒(ms),如果参数置于0,意味着图像会一直显示,知道按下某一个按键。
cv2.destroyAllWindows()的作用是关闭窗口,如果函数形式是如cv2.destroyAllWindow()这样,那么可以填入参数,参数为想要关闭的窗口的名称。

我们也可以先创建一个窗口,然后再打开图像,在某种特殊的情况下,可能需要这么做,那么就需要用到cv2.namedWindow()函数,。
同样cv2.namedWindow()函数也有两个参数:
(1)窗口命名,这个参数需要与cv2.imshow()函数中的第一个参数保持一致;
(2)窗口大小的创建。可选的参数有:WINDOW_AUTOSIZEWINDOW_NORMAL,其中AUTOSIZE创建的窗口是自动匹配打开图像的大小,NORMAL创建的窗口可以调整大小,当图像维太大,或者要添轨迹条时,调整窗口的大小将会很有用。

3.保存图像

如果我们需要将修改完的图像保存下来,那么我们就需要使用cv2.imwrite()函数。
cv2.imwrite()函数同样是两个参数:(1)保存文件的路径、文件名及类型;(2)需要保存的图像的变量名。

参照以下实例,了解一下具体的用法:

import cv2import numpy as npimg = cv2.imread("filename",parameter)cv2.imshow("ImageDispaly",img)i = cv2.waitKey(0) & 0xFFif i == 10:    cv2.destroyAllWindows()elif i == ord("q"):    cv2.imwrite("filename",parameter)    cv2.destroyAllWindows()

其中需要注意的是,如果是64位系统的话,cv2.waitKey(0)这一函数的后面需要加上0xFF,语句。

4.OpenCV和Matplotlib图像显示不一致的问题

Matplotlib是Python的一个绘图库,经常结合Numy和Scipy等库使用,可以实现数据建模分析等功能。同样,在使用图像处理的过程中我们也可以使用Matplotloib库来完成图像的放大、保存等功能。
例如:

#coding:utf-8import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread(r"E:\PythonImage\temp\h_01.jpg,0)plt.imshow(img,cmap = "gray",interpolation = "bicubic")plt.xticks([]),plt.yticks([])plt.show()

显示效果如下:
Demo_1

现在,改变cv2.imread()函数的参数为cv2.imread(r"E:\PythonImage\temp\dota.jpg",1),将图像以彩色的形式显示出来,效果是:
Demo_2_color
实际的原图效果是:

  原图效果

从图中明显看出Matplotlib显示的效果和原图的效果是有很大区别的,事实上,彩色图像使用OpenCV加载时是BGR模式,在Matplotib加载时是RGB模式。因此,在OpenCV中已经读取的彩色图片就不能在Matplotlib正常的显示。

其实,我们可以使用split()函数来解决这个问题,我们还是使用同样的图像素材,修改一下代码:

#coding:utf-8import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread(r"E:\PythonImage\temp\h_01.jpg")b,g,r = cv2.split(img)img2 = cv2.merge([r,g,b])plt.subplot(121);plt.imshow(img)plt.subplot(122);plt.imshow(img2)plt.show()cv2.imshow('bgr image',img)cv2.imshow('rgb image',img2)cv2.waitKey(0)cv2.destroyAllWindows()

得出的效果图是:
对比显示

img

img2

可以看出,修改过后的图像颜色显示是正常的。
split()函数是一个通道分离的函数,从例子中可以清楚的看到split()函数将图像以R,G,B三个通道分离出来,又使用merge()函数重新组合起来,则同时得出merge()函数的作用是通道组合。

有一个更简单的办法实现同样的功能:

img2 = img[:,:,::-1]

使用这个方法可能需要更多的理解Numpy这个库在绘图中所承载的作用及实现的功能。

需要说明一下的就是Matplotlib库中的subplot()函数,其功能与Matlab中的subplot()具有一样的功能,即:subplot(121)中参数作用是创建一个1行2列的区域,并使这个图像显示在第一块分区。

关于Matplotlib库在绘图中的使用,还请参考:http://matplotlib.org/api/pyplot_api.html

0 0