Opencv-Python的常用操作

  • 前言
  • 安装
  • 图片加载、显示和保存
  • 读取cv2.imread
  • cv2.imshow
  • cv2.imshow(window_name,img)
  • cv2.namedWindow(winname, 属性):
  • cv2.waitKey(millseconds)
  • cv2.destroyAllWindows(window_name)
  • 图片写入
  • 基础运算
  • 像素的加减乘除
  • 与或非或
  • 均值和标准差
  • 图像的缩放和翻转
  • cv2.resize
  • cv2.filp
  • 图像加框

前言

研一时总结的一点实用函数,这两天没事,整理出来放到网上。

安装

pip install opencv-python

图片加载、显示和保存

读取cv2.imread

cv2.imread(img_path,flag) 读取图片,返回图片对象

img_path:

  • 图片的路径,即使路径错误也不会报错,但打印返回的图片对象为None

flag:

  • cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1
  • cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0
  • cv2.IMREAD_UNCHANGED,读取图像,包括其alpha通道,也可以传入-1

特别注意:cv2.imread读入的通道顺序是BGR,而plt.imread读入的顺序是RGB。因此可能会涉及到通道顺序转换

img = cv2.imread('1.jpg')
# cv2默认为bgr顺序
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

# 或者这样
im = im[:,:,::-1]

查看维度h, w, c = img.shape

注:

  1. 路径必须是全英文+“/”
  2. 彩色文件读取为[h,w,c],黑白文件读取为[h,w]
  3. 读取的数据类型为uint8

opencv 开闭 opencv关闭imshow窗口_窗口大小

cv2.imshow

cv2.imshow(window_name,img)

显示图片,窗口自适应图片大小。可以指定多个窗口名称,显示多个图片。

window_name: 指定窗口的名字
img:显示的图片对象

cv2.namedWindow(winname, 属性):

创建一个窗口。winname作为窗口的唯一标识,如果想使用指定窗口显示目标图像,需要让cv2.imshow(winname)中的winname与窗口的winname需要保持一致。

窗口创建时可以添加的属性:

  • cv2.WINDOW_NORMAL:窗口大小可以改变(同cv2.WINDOW_GUI_NORMAL)
  • cv2.WINDOW_AUTOSIZE:窗口大小不能改变
  • cv2.WINDOW_FREERATIO:窗口大小自适应比例
  • cv2.WINDOW_KEEPRATIO:窗口大小保持比例

cv2.waitKey(millseconds)

键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)

millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件

在查看图片时,通常写0。由程序员手动关闭

cv2.destroyAllWindows(window_name)

window_name: 需要关闭的窗口名字,不传入时关闭所有窗口

key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
    print(key)
    cv2.destroyAllWindows()

图片写入

cv2.imwrite(img_path_name,img) img_path_name:保存的文件名
img:文件对象

基础运算

通常来说,对于像素的运算工作,一般都是使用numpy来完成的。我们只是使用opencv已封装好的函数,比如翻转,裁剪啊什么的。

像素的加减乘除

• dst = cv2.add(m1, m2)
• dst = cv2.subtract(m1, m2)
• dst = cv2.multiply(m1, m2)
• dst = cv2.divide(m1, m2)

注意:两个像素的相加不完全等于numpy中的相加

x = np.uint8([120])
y = np.uint8([240])
# opencv对超过255的值(uint8),直接截取255
print(cv2.add(x,y))
# numpy的做法是(x+y)%256
print(x+y)

而将像素值转变为np.float则没有此问题

与或非或

• dst = cv2.bitwise_and(m1, m2)
• dst = cv2.bitwise_or(m1, m2)
• dst = cv2.bitwise_not(m1, m2)
• dst = cv2.bitwise_xor(m1, m2)

均值和标准差

m, std = cv2.meanStdDev(im) 注意是标准差

图像的缩放和翻转

cv2.resize

dst = cv2.resize( src, dsize, fx, fy, interpolation )

src

输入图片

dsize

输出图片尺寸

fx, fy

沿x轴,y轴的缩放系数

interpolation

插入方式

cv2.INTER_NEAREST

最近邻插值

cv2.INTER_LINEAR

双线性插值(默认设置)

cv2.INTER_AREA

使用像素区域关系进行重采样

cv2.INTER_CUBIC

4x4像素邻域的双三次插值

cv2.INTER_LANCZOS4

8x8像素邻域的Lanczos插值

h,w,c = im.shape
# 直接指定大小,尺寸必须是整数
# 注意此处的顺序是(w,h)!
im2 = cv2.resize(im,(round(0.5*w),round(0.5*h)))

# 指定缩放比例
im3 = cv2.resize(im,(0,0),fx=0.5,fy=0.5)

cv2.filp

  • img2=cv2.flip(img1, 0) #上下翻转
  • img2=cv2.flip(img1, 1)#左右翻转
  • img2=cv2.flip(img1, -1) #上下、左右翻转

图像加框

其实当时的程序里用到很多cv2的函数,这里只记了一个基础的。需要什么再查吧。
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → None

重点在于以下几个参数

  • img,输入图像
  • pt1,方框左上角的坐标(x,y)
  • pt2,方框右下角的坐标(x,y)
  • color,框的颜色(B,G,R)
  • thicknes,线的粗细
cv2.rectangle(im,(0,200),(2000,2000),(0,0,255),15)

参考

  1. 官方API