OpenCV(python)——一键入门--第1篇

网友投稿 1040 2022-05-28

一:图像读取与展示

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会参考该参数创建一个对应的新窗口,并展示该图像。

OpenCV(python)——一键入门--第1篇

补充:如果窗口是使用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的列数组

在代码中,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(或运算)

这些像素级的图像计算函数共通的,两个参数为参与运算的两个图像变量。然后用 “=” 号承接图像即可。

AI OpenCV Python 机器视觉

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《图解HTTP》读后笔记02
下一篇:数据库的方向 - 行vs列
相关文章