opencv-python学习(1)--读写与缩放

摘要

opencv的python图像处理学习笔记

1.安装和导入

1
pip install opencv-python
1
import cv2

2.读取与显示

读取图片 img = cv2.imread (filename,flags=None)

路径要全英文,图像路径错误不会报错会返回None

读取到了返回的是numpy.ndarray对象

1
2
3
4
5
6
7
# -1表示保持原有的格式不变
# 0表示将图像调整为单通道的灰度图像
# 1表示将图像调整为3通道的BGR通道。为默认值


img=cv2.imread("test.jpg")
img=cv2.imread("test.jpg",0)

展示图片 cv.imshow(“窗口名字”,被读取的图片)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 显示一个可以调大小的窗口
cv2.namedWindow("image",cv2.WINDOW_FREERATIO)

# cv2.WINDOW_NORMAL # 用户可以改变这个窗口大小
# cv2.WINDOW_AUTOSIZE # 窗口大小自动适应图片大小,并且不可手动更改。
# cv2.WINDOW_FREERATIO # 自适应比例
# cv2.WINDOW_KEEPRATIO # 保持比例
# cv2.WINDOW_OPENGL # 窗口创建的时候会支持OpenGL


# 打开一个名为“image”的窗口并展示图片
cv2.imshow("image",img)

1
2
3
4
5
# 等待结束
cv2.waitKey(0)
# 不加窗口会闪退,值为时间单位ms,0代表永久
cv2.destroyAllWindows()
# 关掉所有窗口

汇总

1
2
3
4
5
6
img=cv2.imread("hmbb.jpg")
print('Original Dimensions : ',img.shape) # 显示图片大小等参数
# cv2.namedWindow("image",cv2.WINDOW_FREERATIO)
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.缩放

cv2.resize()

快速使用

1
2
img = cv.resize(img,(width,height))
# 默认双线性插值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
resize(InputArray src, OutputArray dst, Size dsize, 
double fx=0, double fy=0, int interpolation=INTER_LINEAR )

InputArray src :输入,原图像
OutputArray dst: 输出,缩放后的图像

dsize:输出图像的大小,要元组类型,两个元素xy。

fx:width方向的缩放比例
fy:height方向的缩放比例

interpolation:指定插值方法

INTER_NEAREST - 最邻近插值
INTER_LINEAR - 双线性插值(默认)
INTER_CUBIC - 4x4像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

图片缩放函数

来自计算机视觉图像处理-CV2与图像插值算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def inter(img):
'''
图像缩放
param: img
return: None
'''
scale_percent = 30 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
# 双线性插值缩小
resized = cv2.resize(img, dim, interpolation = cv2.INTER_LINEAR) # 缩小到0.3

# 缩放大小
fx = 1.5
fy = 1.5
# 方法1:最近邻插值放大
nearest_resized = cv2.resize(img, dsize=None, fx=fx, fy=fy, interpolation = cv2.INTER_NEAREST)
# 方法2:双线性插值放大
linear_resized = cv2.resize(img, dsize=None, fx=fx, fy=fy, interpolation = cv2.INTER_LINEAR)

# 展示结果
cv2.imshow("Resized image", resized)
cv2.imshow("INTER_NEAREST image", nearest_resized)
cv2.imshow("INTER_LINEAR image", linear_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.保存

借用官方文档的代码

1
2
3
4
5
6
7
8
9
10
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # 等待ESC退出
cv.destroyAllWindows()
elif k == ord('s'): # 等待关键字,保存和退出
cv.imwrite('messigray.png',img)
cv.destroyAllWindows()

手册说如果是64位,需使用k = cv.waitKey(0) & 0xFF但实测不需要也是对的。

参考资料

[1] https://www.cnblogs.com/luozx207/p/8611459.html

[2] https://blog.csdn.net/qq_51491920/article/details/124408811

[3] cv2.resize()原理详解