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

举报
拓佑豪 发表于 2021/07/15 12:36:22 2021/07/15
【摘要】 opencv的图像基础操作
  • 一:图像读取与展示
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(或运算)

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。