您的位置:首页 > 编程语言 > Python开发

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

2015-09-01 15:37 639 查看
主要函数:

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 = -1
CV_LOAD_IMAGE_GRAYSCALE = 0
CV_LOAD_IMAGE_COLOR = 1
CV_LOAD_IMAGE_ANYDEPTH = 2
CV_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_AUTOSIZE
WINDOW_NORMAL
,其中AUTOSIZE创建的窗口是自动匹配打开图像的大小,NORMAL创建的窗口可以调整大小,当图像维太大,或者要添轨迹条时,调整窗口的大小将会很有用。

3.保存图像

如果我们需要将修改完的图像保存下来,那么我们就需要使用
cv2.imwrite()
函数。

cv2.imwrite()
函数同样是两个参数:(1)保存文件的路径、文件名及类型;(2)需要保存的图像的变量名。

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

import cv2
import numpy as np
img = cv2.imread("filename",parameter)
cv2.imshow("ImageDispaly",img)
i = cv2.waitKey(0) & 0xFF
if 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-8

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread(r"E:\PythonImage\temp\h_01.jpg,0)
plt.imshow(img,cmap = "gray",interpolation = "bicubic")
plt.xticks([]),plt.yticks([])
plt.show()


显示效果如下:



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



实际的原图效果是:



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

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

#coding:utf-8

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = 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()


得出的效果图是:







可以看出,修改过后的图像颜色显示是正常的。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: