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工具从命令行安装。
    file

代码引入cv2即可使用。

import cv2

图像处理基本操作

读取图像

读取指定图像文件。

img = cv2.imread(filename[, flags])

flags标记值指定了打开图片的方式,默认为1 cv2.IMREAD_COLOR,即将图像调整为三通道的BGR图像。

各flags如图:
将“python定义”中的cv修改为cv2。
file

以下均为正例:

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是图片对象。
若之前没有生成过对应的winnameimshow()会自动生成,因此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)

图像表示方法

  1. 二值图像
    仅包含黑或白两个颜色的图像。
    每个像素点可用1bit表示。
  2. 灰度图像
    对于灰度,每个像素用[0, 255]区间来表示亮度,0最暗,255最亮。
    1Byte(8bit)就可以表示一个像素点的灰度值。
  3. 彩色图像
    彩色图像包含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()

得到下图:
file

使用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()

得到下图:
file

彩色图像

例:

# 读取(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()

得到下图:
file