OpenCV(python)——一键入门--第1篇
- 一:图像读取与展示
import cv2 as cv
src = cv.imread("d:/ma.jpg") #imread函数,读入一张图片,放在src底下
cv.namedWindow("input",cv.WINDOW_AUTOSIZE) #namedWindow 声明一个窗口,可以在这里调整窗口大小
cv.imshow("intput",src) #imshow函数,展示src底下的照片
cv.waitKey(0)
cv.destroyAllWindows()
- cv.imread()
cv,imread() 是一个图像读取函数,里面主要输入一个字符串,内容是图像所在的绝对路径或者相对路径。我们需要把完整的路径用双引号保存下来。(请注意,需要提前在路径放好该照片)
补充:cv.imread() 除了直接读取照片,还可以传入第二个参数,比如可以直接设置cv.imread("图像路径",cv.IMREAD_GRAYSCALE),将图像直接读取成灰度图。相关参考资料如下图:
- cv.namedWindow()
cv.nameWindow()是一个窗口声明函数。第一个参数是该窗口的标题,第二个参数是窗口的模式。最常用的参数是WINDOW_AUTOSIZE。
其他参数简介如下,感兴趣的话可以参考,或者可以直接看下一个函数的介绍:
- WINDOW_NORMAL 或 WINDOW_AUTOSIZE: WINDOW_NORMAL 可以调整窗口大小,而 WINDOW_AUTOSIZE 会自动调整窗口大小以适合显示的图像,并且无法手动更改窗口大小。
- WINDOW_FREERATIO 或 WINDOW_KEEPRATIO: WINDOW_FREERATIO 调整图像而不考虑其比例,而 WINDOW_KEEPRATIO 保持图像比例。
- WINDOW_GUI_NORMAL 或 WINDOW_GUI_EXPANDED: WINDOW_GUI_NORMAL 是在没有状态栏和工具栏的情况下绘制窗口的旧方法,而 WINDOW_GUI_EXPANDED 是一种新的增强型 GUI。默认情况下,标志 == WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED
- cv.imshow()
cv.imshow() 是图像展示函数,我们看代码第5行第一个参数,是图片展示对应的窗口名称。如果该参数和namedWindow设置的窗口大小一致,则会将图片放在该窗口下。如果是一个全新的标题名,OpenCV会参考该参数创建一个对应的新窗口,并展示该图像。
补充:如果窗口是使用WINDOW_AUTOSIZE标志创建的,则图像以其原始大小显示,但仍受屏幕分辨率的限制。否则,它会将缩放图像以适合窗口。该函数可以缩放图像,具体取决于其深度:
- 如果图像是 8 位无符号,则按原样显示。
- 如果图像是 16 位无符号或 32 位整数,则将像素除以 256。即值范围 [0,255*256] 映射到 [0,255]。
- 如果图像是 32 位或 64 位浮点,则像素值乘以 255。即值范围 [0,1] 映射到 [0,255]。
关于展示图像相关的补充:
如果窗口是使用 OpenGL 支持创建的,则cv::imshow还支持ogl::Buffer、ogl::Texture2D和cuda::GpuMat作为输入。
如果在此函数之前没有创建窗口,则假定使用cv::WINDOW_AUTOSIZE创建一个窗口。
如果需要显示大于屏幕分辨率的图像,则需要在 imshow 之前调用 namedWindow("", WINDOW_NORMAL)。
- cv.waitKey()
cv.waitKey()是一个键盘绑定函数,时间量度是毫秒ms。函数会等待(n)里面的n毫秒,看是否有键盘输入。当有键盘输入时,则会返回按键的ASCII值。没有键盘输入,则返回-1。一般我们设置为0,他会无限等待键盘的输入。
- cv.destroyAllWindows()
cv.destroyAllWindows()是用来删除窗口的,()里不指定任何参数,则删除所有窗口。删除特定的窗口,则需要调用destroyWindow(),往()输入特定的窗口值。主要用于释放变量占用的内存
你可以调用destroyWindow()或 destroyAllWindows()来关闭窗口并取消分配任何相关的内存使用。对于一个简单的程序来说,实际上不必调用这些函数,因为退出时操作系统会自动关闭应用程序的所有资源和窗口。如果任何相关内存使用没有被取消分配,则调用destroyAllWindows()会处理掉分配。如果是简单的使用或确保资源的适当使用,就不需要调用该函数。
- 二:图像色域转换
a = cv.cvtColor(src , cv.COLOR_BGR2HSV)
#转换色域,xxx2xxx
#包括以下色域:YCrCb,HSV,HLS,Lab,Luv,Bayer,XYZ,GRAY
cv.imshow("output",a)
提醒:当然,import 语句以及cv.waitKey(),cv.destroyAllWindows()都是很重要的语句,在往后部分仅强调核心的部分代码,运行时候记得在首尾加上。
- cv.cvtColor()
该函数将输入图像从一种颜色空间转换为另一种颜色空间。 我们主要使用的色域空间如下:YCrCb , HSV , HLS , Lab , Luv , Bayer , XYZ , GRAY
R、G 和 B 通道值的常规范围是:
- CV_8U 图像为 0 到 255
- CV_16U 图像的 0 到 65535
- CV_32F 图像为 0 到 1
如下图所示,output是原图,g-output则是图像处于hsv色域时的图
重点:opencv中的图像通道默认不是RGB,而是BGR,也就是
通道0对应蓝色,通道1对应绿色,通道2对应红色
- 三:图像的修改
import cv2 as cv
import numpy as np
m1 = src
cv.imshow("m1",m1) #原图
m2 = np.copy(src) #图像拷贝
m2[100:300,300:500,2]=255 #修改像素坐标底下的通道值
cv.imshow("m2",m2)
m3 = np.zeros(src.shape, src.dtype) #使用numpy创建一个空图像
cv.imshow("m3", m3)
m4 = np.zeros([512,215,3], np.uint16)#高 宽 通道数ch,这里是设置图像大小
m4[:,:,1] =127 #给绿色通道赋值 127
cv.imshow("m4", m4)
cv.waitKey(0)
cv.destroyAllWindows()
- numpy
NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。我们用简写np来描述numpy函数。
- np.copy
拷贝矩阵。我们的图像可以看成是一个二维矩阵,可以直接用numpy的copy函数拷贝图像,括号内是要拷贝的图像,然后用 “=” 号赋值给新的变量。
- np.zeros
numpy.zeros(shape, dtype = float, order = 'C')
创建指定大小的数组,数组元素以 0 来填充
参数介绍:shape:数组形状。需要传入图像的宽和高。也可以用 image.shape传入数据。
dtype:数据类型。可以参考如下表格:
order:‘C’用于C的行数组。或者用‘F’用于FORTRAN的列数组
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
在代码中,m2[100:300,300:500,2]=255,是将像素点从左上角开始数,坐标区间【100->300】,【300->500】的像素进行赋值。坐标和值都可以自己设置
- 四:像素之间的加减法
src = cv.imread("D:/p1.jpg")
src2 = cv.imread("D:/p2.jpg")
#加法
add_result = np.zeros(src2.shape, src2.dtype)
cv.add(src,src2,add_result)
cv.imshow("add-result",add_result)
#减法
sub_result = np.zeros(src2.shape, src2.dtype)
cv.subtract(src,src2,sub_result)
cv.imshow("sub_result",sub_result)
#乘法
mul_result = np.zeros(src2.shape, src2.dtype)
cv.multiply(src,src2,mul_result)
cv.imshow("mul_result",mul_result)
#除法
div_result = np.zeros(src2.shape,src2.dtype)
cv.divide(src,src2,div_result)
cv.imshow("div_result",div_result)
- cv.add() 加法 ;cv.subtract() 减法 ;cv.multiply() 乘法 ;cv.divide() 除法
这些像素级的图像计算函数共通的,前两个参数为需要参与计算的两张图像,最后一个参数是输出的图像。通常我们会用 np.zeros 函数创建一个新的空图像。然后再放进函数中去
- 五:像素逻辑运算
#逻辑运算
dst1 = cv.bitwise_and(src, src2)#与运算
dst2 = cv.bitwise_xor(src, src2)#异或运算
dst3 = cv.bitwise_or(src, src2) #或运算
cv.imshow("dst1", dst1)
cv.imshow("dst2", dst2)
cv.imshow("dst3", dst3)
- cv.bitwise主要有四种逻辑运算函数 cv.bitwise_and(按位与) cv.bitwise_not(非运算) cv.bitwise_xor(异或运算) cv.bitwise_or(或运算)
这些像素级的图像计算函数共通的,两个参数为参与运算的两个图像变量。然后用 “=” 号承接图像即可。
- 点赞
- 收藏
- 关注作者
评论(0)