OpenCV基础
基于Python的OpenCV基础知识。
平台:Windows。
安装
- 对于普通的Python环境,在 www.lfd.uci.edu 下载对应Python版本的OpenCV的whl文件,使用pip手动安装。
注意:OpenCV依赖于numpy库,因此需要一同安装。pip install numpy pip install opencv_python-4.5.5-cp311-cp311-win_amd64.whl
- 对于Anaconda环境,使用Anaconda Navigator管理器为对应的conda环境安装opencv库,或使用Anaconda Prompt工具从命令行安装。
代码引入cv2
即可使用。
import cv2
图像处理基本操作
读取图像
读取指定图像文件。
img = cv2.imread(filename[, flags])
flags标记值指定了打开图片的方式,默认为1
cv2.IMREAD_COLOR
,即将图像调整为三通道的BGR图像。
各flags如图:
将“python定义”中的cv修改为cv2。
以下均为正例:
img1 = cv2.imread(r"1.jpg")
img2 = cv2.imread(r"D:\2.jpg")
img3 = cv2.imread(r"3.jpg", cv2.IMREAD_COLOR)
img4 = cv2.imread(r"4.jpg", -1)
显示图像
namedWindow函数
此函数是可选的,不使用此函数也可以显示图像。
生成一个指定名称的窗口供之后显示图像。
cv2.namedWindow(winname)
imshow函数
显示图像。
cv2.imshow(winname, img)
winname
是要显示到的窗体的名称,img
是图片对象。
若之前没有生成过对应的winname
,imshow()
会自动生成,因此namedWindow()
其实是可选的。
例:
img = cv2.imread(r"1.jpg")
cv2.imshow('title', img)
这样子窗口实际上会一闪而过,根本看不清。因此需要和下面的waitKey()
函数进行配合。
waitKey函数
等待用户按键,期间阻塞运行;若指定了超时,则经过指定的超时后继续运行下面的代码。
key = cv2.waitKey([delay])
- 没有按键按下超时后返回
-1
。若有按键按下则返回按键的ASCII码。 delay
表示等待超时时间,单位ms。当设置为非正数时无限等待。默认为0
。
配合imshow()
函数显示图片的例子:
img = cv2.imread(r"1.jpg")
cv2.imshow('title', img)
cv2.waitKey()
destroyWindow函数
释放(销毁)指定窗口。
cv2.destroyWindow(winname)
destroyAllWindows函数
释放(销毁)所有窗口。
cv2.destroyAllWindows()
保存图像
将某一图像对象保存为图像文件。
cv2.imwrite(filename, img)
返回保存结果(True/False)。
例:
img = cv2.imread(r"1.jpg")
cv2.imwrite(r"2.jpg", img)
图像表示方法
- 二值图像
仅包含黑或白两个颜色的图像。
每个像素点可用1bit表示。 - 灰度图像
对于灰度,每个像素用[0, 255]区间来表示亮度,0最暗,255最亮。
1Byte(8bit)就可以表示一个像素点的灰度值。 - 彩色图像
彩色图像包含BGR三色的通道,每个通道中用[0, 255]区间表示该通道的颜色值(类比灰度)。
注意:OpenCV中彩色通道的存储顺序是BGR而不是常见的RGB。
每个彩色像素点需要用3Byte来表示。
像素处理
OpenCV使用numpy.array数组类型存储图像。
二值及灰度图像
二值/灰度图像使用二维数组存储图像。
读取及修改像素的例子:
import cv2
import numpy as np
# 生成8*8的黑色图像
img = np.zeros((8, 8), dtype=np.uint8)
cv2.imshow("title", img)
# 显示8*8纯黑图片
cv2.waitKey()
# 读取像素点(0, 3)
print(img[0, 3])
# 读取结果为0
# 修改像素点(二值图像应修改为1)
img[0, 3] = 255
# 读取像素点(0, 3)
print(img[0, 3])
# 读取结果为255
cv2.imshow("title", img)
# 图片出现一个白色像素
cv2.waitKey()
彩色图像
彩色图像使用三维数组存储图像,可以使用表达式访问数组内的值。
第一个索引表示行,第二个索引表示列,第三个索引表示颜色通道。
例:
- img[0, 0] 访问img0行0列像素的BGR值,得到的是一个数组,分别表示三个通道的色彩值。如:[0, 0, 255]。
- img[0, 0, 0] 访问img0行0列第0个通道(B)的色彩值,得到的是一个[0, 255]内的整数。
读取及修改像素的例子:
import cv2
import numpy as np
# 生成300*300的三通道黑色图像
img = np.zeros((300, 300, 3), dtype=uint8)
# 左边R通道设置为255
img[:, 0:100, 2]=255
# 中间G通道设置为255
img[:, 100:200, 1]=255
# 右边B通道设置为255
img[:, 200:300, 0]=255
cv2.imshow("title", img)
cv2.waitKey()
得到下图:
使用numpy.array访问像素
numpy.array提供了item()
和itemset()
函数分别用于读写元素(像素值),而且这两个函数是经过优化处理的,能大幅提高处理效率。
二值及灰度图像
例:
# 读取(0, 3)处的像素值
print(img.item(0, 3))
# 修改(0, 3)处的像素值为255
img.itemset((0, 3), 255)
生成随机灰度值图片:
import cv2
import numpy as np
img = np.random.randint(0, 256, size=[256, 256], dtype=np.uint8)
cv2.imshow("title", img)
cv2.waitKey()
得到下图:
彩色图像
例:
# 读取(0, 3, 0)处的像素值(B通道)
print(img.item(0, 3, 0))
# 修改(0, 3, 0)处的像素值为255(B通道)
img.itemset((0, 3, 0), 255)
生成随机彩色值图片:
import cv2
import numpy as np
img = np.random.randint(0, 256, size=[256, 256, 3], dtype=np.uint8)
cv2.imshow("title", img)
cv2.waitKey()
得到下图:
Comments 2 条评论
博主 啵啵同学√
这是一条私密评论
博主 zhangxinhui02
@啵啵同学√ 这是一条私密评论