OpenCV之cv2函数 2
1、主要函数
1、 cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括
cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。
PS:调用opencv,就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命
令print(img)时得到的结果是None。
2、cv2.imshow():创建一个窗口显示图片,共两个参数,第一个参数表示窗口名字,可以创建多个窗口中,但是每个窗口不能重名;第二个参数是读入的图片,窗口大小自动调整为图片大小。
3、cv2.waitKey():键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。
4、cv2.destroyAllWindows():删除建立的全部窗口。
5、cv2.destroyWindows():删除指定的窗口。
6、cv2.imwrite(file,img,num):保存图片,共3个参数,第一个为保存文件名,第二个为读入图片,可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.。
注意:
cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 intcv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。
cv2.imwrite('1.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
cv2.imread()
使用opencv和caffe的伙伴们,可能会有一个疑问,那就是对于同时读取图片的cv2.imread()和caffe.io.loadimage两个函数,有什么差别?
1、cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255,通道格式为(W,H,C)
2、caffe.io.load_image()读进来是RGB格式和 0~1(float)
因此,cv2.imread()读取的数据,需要进过转换后,才和caffe.io.load_image()相同,例如:
image = caffe.io.load_image('examples/images/cat.jpg')
image1=cv2.imread('examples/images/cat.jpg')
image1=cv2.cvtColor(image1,cv2.COLOR_BGR2RGB)
image1=image1/255.
经过转换后,cv2.imread读取的image1和caffe.io.load_image()读取到的image格式相同。
所以在进行特征提取之前要在transformer中设置transformer.set_raw_scale(‘data’,255)(缩放至0~255) 以及transformer.set_channel_swap(‘data’,(2,1,0)(将RGB变换到BGR)。
调用caffe model进行特征提取分类时,要注意区分image用何种方法读进来。
cv2.imread不能正常读取gif格式图片
Python中cv2模块的imread函数可以正常读取’jpg’,'png’格式的图片,但是不能处理’gif’图片。可以改用imageio模块来处理。
import cv2
import imageio
def readImg(im_fn):
im = cv2.imread(im_fn)
if im is None :
print('{} cv2.imread failed'.format(im_fn))
tmp = imageio.mimread(im_fn)
if tmp is not None:
imt = np.array(tmp)
imt = imt[0]
im = imt[:,:,0:3]
return im
help(imageio.mimread)
关于cv2.imread()读取图像为BGR问题
opencv读取图像为b,g,r方法,比如
img = cv2.imread("xx.jpg")
cv2.imshow("xx",img)
展示的结果是正常的:
![](https://ask.qcloudimg.com/http-save/yehe-4908043/d1wpv4md0j.png?imageView2/2/w/1620)
但是此时读取到的img已经为bgr方式了,如果我们再用其他使用rgb方式读取的函数进行读取时就会出错,比如我用plt对图像进行显示,效果如下:
![](https://ask.qcloudimg.com/http-save/yehe-4908043/v96wkd53sd.png?imageView2/2/w/1620)
因为plt函数是rgb方式读取的,所以会出错.这时我们可以手动改变img的通道顺序,如下:
b,g,r = cv2.split(img)
img_rgb = cv2.merge([r,g,b])
plt.figure()
plt.imshow(img_rgb)
plt.show()
这时img_rgb就是rgb顺序的了.那么这时再用cv2.imshow()显示出来,rgb错误:
![](https://ask.qcloudimg.com/http-save/yehe-4908043/x1nt1w452j.png?imageView2/2/w/1620)
简单实例
1、以下面的图片为例
![](https://ask.qcloudimg.com/http-save/yehe-4908043/3rq3x04dx3.jpeg?imageView2/2/w/1620)
2、显示并保存彩色图片
# -*- coding: utf-8 -*-
import cv2
img=cv2.imread('1.jpg',cv2.IMREAD_COLOR)# 读入彩色图片
cv2.imshow('image',img)#建立image窗口显示图片
k=cv2.waitKey(0)#无限期等待输入
if k==27:#如果输入ESC退出
cv2.destroyAllWindows()
elif k==ord('s'):#如果输入s,保存
cv2.imwrite('test.png',img)
print("OK!")
cv2.destroyAllWindows()
显示结果:
![](https://ask.qcloudimg.com/http-save/yehe-4908043/szjmpc58xn.png?imageView2/2/w/1620)
3、显示并保存黑白图片
# -*- coding: utf-8 -*-
import cv2
img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)# 读入彩色图片
cv2.imshow('image',img)#建立image窗口显示图片
k=cv2.waitKey(0)#无限期等待输入
if k==27:#如果输入ESC退出
cv2.destroyAllWindows()
elif k==ord('s'):
cv2.imwrite('test.png',img)
print("OK!")
cv2.destroyAllWindows()
显示结果:
![](https://ask.qcloudimg.com/http-save/yehe-4908043/ybipajhmwh.png?imageView2/2/w/1620)
2、图片操作
1、使用函数cv2.flip(img,flipcode)翻转图像,flipcode控制翻转效果。
flipcode = 0:沿x轴翻转 flipcode > 0:沿y轴翻转 flipcode < 0:x,y轴同时翻转
imgflip = cv2.flip(img,1)
2、复制图像
imgcopy = img.copy()
3、颜色空间转换
#彩色图像转为灰度图像
img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
灰度图像转为彩色图像
img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
4、读入一副图像,给图片加文本
import cv2
# img=cv2.imread('1.jpg',cv2.IMREAD_COLOR)
img=cv2.imread('1.png',cv2.IMREAD_COLOR) # 打开文件
font = cv2.FONT_HERSHEY_DUPLEX # 设置字体
# 图片对象、文本、像素、字体、字体大小、颜色、字体粗细
imgzi = cv2.putText(img, "zhengwen", (1100, 1164), font, 5.5, (0, 0, 0), 2,)
# cv2.imshow('lena',img)
cv2.imwrite('5.png',img) # 写磁盘
cv2.destroyAllWindows() # 毁掉所有窗口
cv2.destroyWindow(wname) # 销毁指定窗口
5、配合画图
import numpy as np
import cv2
np.set_printoptions(threshold='nan')
# 创建一个宽512高512的黑色画布,RGB(0,0,0)即黑色
img=np.zeros((512,512,3),np.uint8)
# 画直线,图片对象,起始坐标(x轴,y轴),结束坐标,颜色,宽度
cv2.line(img,(0,0),(311,511),(255,0,0),10)
# 画矩形,图片对象,左上角坐标,右下角坐标,颜色,宽度
cv2.rectangle(img,(30,166),(130,266),(0,255,0),3)
# 画圆形,图片对象,中心点坐标,半径大小,颜色,宽度
cv2.circle(img,(222,222),50,(255.111,111),-1)
# 画椭圆形,图片对象,中心点坐标,长短轴,顺时针旋转度数,开始角度(右长轴表0度,上短轴表270度),颜色,宽度
cv2.ellipse(img,(333,333),(50,20),0,0,150,(255,222,222),-1)
# 画多边形,指定各个点坐标,array必须是int32类型
pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
# -1表示该纬度靠后面的纬度自动计算出来,实际上是4
pts = pts.reshape((-1,1,2,))
# print(pts)
# 画多条线,False表不闭合,True表示闭合,闭合即多边形
cv2.polylines(img,[pts],True,(255,255,0),5)
#写字,字体选择
font=cv2.FONT_HERSHEY_SCRIPT_COMPLEX
# 图片对象,要写的内容,左边距,字的底部到画布上端的距离,字体,大小,颜色,粗细
cv2.putText(img,"OpenCV",(10,400),font,3.5,(255,255,255),2