- 思而不学 犹豫不决 浪费时间
- 学而不思 三心二意 效率低下
1 Opencv安装
pip insatll opencv-python
2 图像概述
-
参考链接:https://blog.csdn.net/wohu1104/article/details/86485447
-
生活中图像都是由 RGB 三原色构成的,计算机中 RGB 这三个颜色的取值通常是在 0-255 之间
- R 表示红色(Red)
- G 表示绿色 (Green)
- B 表示蓝色(Blue)
-
彩色图片有三个通道,所以属于三通道图片。
- 计算机中的像素值通常是用 8 位的无符号整型(unit8)表示,取值范围是 0-255
- 假设将图片颜色从黑到白分成 256 级,即通常说的黑白图片,也叫单通道图片,0 表示最黑,1 表示最白。
-
RGB 的构成示例 (0, 255, 255)
- 第一个元素表示红色的数值
- 第二个元素表示绿色的数值
- 第三个元素表示蓝色的数值
-
每个图像都是由于很多个 3 个通道的彩色像素组成,可以将图像看成一个矩阵,其中每个像素对应矩阵中的一个位置,譬如:
- 图片左上角的像素点位置是(0, 0)
- 图片右上角的像素点位置是(1079, 0)
- 图片左下角的像素点位置是(0, 1439)
- 图片右下角的像素点位置是(1079, 1439)
2 第一个cv小程序:
2.1 读取图像并显示
-
读取图像并显示
-
1、加载图像: cv2.imread(img_path, read_type),read_type: 默认读入彩色图像,0读入灰度图像
-
2、创建一个GUI窗口,用来显示图片,使用到的函数是:cv2.namedWindow()
- 调整窗口大小:默认参数cv2.WINDOW_AUTOSIZE 不可调整窗口大小;cv2.WINDOW_NORMAL 可以调整窗口大小
-
3、通过图像变量,加载显示图像:cv2.imshow()
-
4、等待,用户下一步操作:cv2.waitKey() 如果设置这个函数的参数为0,那它将会无限期的等待键盘输入。
-
5、删除我们建立的所有窗口,释放资源:cv2.destroyAllWindows(),cv2.destroyWindow() 用于删除特定的窗口,可以使用在括号内输入你想删除的窗口名。
-
-
代码实例
# 导入模块
import cv2 as cv
src = cv.imread('test.jpg')
cv.namedWindow('input image', cv.WINDOW_NORMAL)
cv.imshow('input image', src)
cv.waitKey(0)
cv.destroyAllWindows()
2.2 保存图像
- 保存图像:使用函数 cv2.imwrite(filename, img)
- 第一个参数是要保存的文件名
- 第二个参数是图像在内存中的对象
cv.imwrite('test-save.png', img)
2.3 demo小程序
- 加载灰度图
- 按
enter
不保存图片,直接退出;按s
保存图片,并退出
# 导入模块
import cv2 as cv
img = cv.imread('test.jpg', 0) # 加载灰度图
cv.namedWindow('input image', cv.WINDOW_NORMAL)
cv.imshow('input image', img)
key = cv.waitKey(0)
if key == 27: # 27 即是 enter
cv.destroyAllWindows()
elif key == ord('s'): # 按s保存退出
cv.imwrite('test-save1.png', img) # 保存灰度图
cv.destroyAllWindows()
3 图像扩展缩放
-
扩展缩放只是改变图像的尺寸大小;
-
OpenCV 的函数 cv2.resize() 可以实现这个功能,图像的尺寸可以自己手动设置,也可以指定缩放因子。
-
我们可以选择使用不同的插值方法:
-
在缩放时推荐使用 cv2.INTER_AREA,
-
在扩展时推荐使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。
-
-
默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR
# 导入模块
import cv2 as cv
img = cv.imread('test.jpg') # 加载图像
cv.imshow('origin', img)
# 设置缩放因子
# 0.75倍缩放
res = cv.resize(img, None, fx=0.75, fy=0.75, interpolation=cv.INTER_AREA) # 缩放
cv.imshow('input image INTER_AREA', res) # 显示缩放后图像
res = cv.resize(img, None, fx=0.75, fy=0.75, interpolation=cv.INTER_NEAREST) # 缩放
cv.imshow('input image INTER_NEAREST', res) # 显示缩放后图像
# 直接设置输出图像尺寸
height, width = img.shape[:2] # 432 432
print(height, width)
# 2倍扩展
res = cv.resize(img, (2 * width, 2 * height), interpolation=cv.INTER_CUBIC) # 扩展
cv.imshow('input image INTER_CUBIC', res) # 显示扩展后图像
res = cv.resize(img, (2 * width, 2 * height), interpolation=cv.INTER_LINEAR) # 扩展
cv.imshow('input image INTER_LINEAR', res) # 显示扩展后图像
res = cv.resize(img, (2 * width, 2 * height), interpolation=cv.INTER_LANCZOS4) # 扩展
cv.imshow('input image INTER_LANCZOS4', res) # 显示扩展后图像
cv.waitKey(0)
cv.destroyAllWindows()