OpenCV入门

读图、展示和保存新图


import cv2

image = cv2.imread('000.jpg')

print(f"width:{image.shape[1]} pixels")
print(f"height:{image.shape[0]} pixels")
print(f"channels:{image.shape[2]} pixels")

cv2.imshow("Image", image)
cv2.waitKey(0) # 数字0表示按任意键0毫秒后执行

cv2.imwrite("new_image.jpg", image)

​ cv2.imread()返回一个代表图片的NumPy数组,还有第二个参数,表示读取图片返回的格式,有三种选择:cv2.IMREAD_COLOR, cv2.IMREAD_GRAYSCALE 和 cv2.IMREAD_UNCHANGED。分别用1,0和-1表示。

​ OpenCV采用的格式为H×W×C,通道顺序为BGR,而Python的Pillow库为RGB。

像素点及局部图像


​ 为获取某点的像素,需要有一个简单的左边概念,左上角(0,0)点为原点,向下向右为正。OpenCV读取图片片后返回的是一个NumPy矩阵对象,可以使用下表来获取特定坐标的像素值。如(b,g,r)=image[10,10]便可得到(10,10)点的像素值,此处使用了Python中的turple数据结构,涉及packing和unpacking的操作,同样也可以改变其值,如image[10,10]=(255,255,0)。

​ 获取局部图像可以使用Python中切片的概念,如patch1=iamge[0:100, 0:100], cv2.imshow(“patch1”,patch1), 便可显示此局部图像,也可以进行修改,如image[0:100, 0:100]=(0, 255, 255)。

基本线条操作


import cv2
import numpy as np

canvas = np.zeros((300, 300, 3), dtype='uint8')  # 生成全0矩阵,即一张黑色图片

for _ in range(0, 25):
    radius = np.random.randint(5, 200)  # 生成半径
    color = np.random.randint(0, 256, size=(3,)).tolist()  # 填充颜色
    pt = np.random.randint(0, 200, size=(2,))  # 生成圆的中心点

    cv2.circle(canvas, tuple(pt), radius, color, -1)  # 传递参数并画圆
# 重复25次,随机生成半径、颜色和中心点
cv2.imshow('Canvas', canvas)
cv2.waitKey(0)

平移


M = np.float32([[1, 0, 25], [0, 1, 50]])
shifted_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

​ M中的参数[1, 0, 25]表示向[1, 0]方向移动25像素。最终表示将图片向右移动25像素,向下移动50像素。

旋转


(h, w) = image.shape[:2]
center = (w // 2, h // 2)

M = cv2.getRotationMatrix2D(center, 135, 1.0)
Rotated_image = cv2.warpAffine(image, M, (w, h))

​ 先获取高度和宽度还有中心点,创建旋转矩阵M,cv2.getRotationMatrix2D有三个参数:第一个为旋转时固定的点;第二个为旋转角度;第三个为图片缩放尺度,其中1表示保持原图大小。然后进行仿射变换,完成旋转。

缩放


new_w, new_h = 100, 200
resized_image = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_AREA)

​ 缩放操作主要为变换图片大小可使用cv2.resize()函数,该函数可使用的参数有三个:第一个参数为图像对象,第二个参数为缩放尺寸,第三个参数为插值选项。

​ 官方建议缩小使用cv2.INTER_AREA,放大使用cv2.INTER_LINEAR。

翻转


​ 翻转分为水平翻转和垂直翻转,API为cv2.flip()

flipped_image = cv2.flip(image, -1)

​ 第二个参数1表示水平翻转,0表示垂直翻转,-1表示水平加垂直翻转。

裁剪


​ 裁剪使用NumPy中的切片操作即可

cropped_image = image[200:500, 500:800]

算术操作


​ OpenCV进行阶段操作,NumPy是取模。

x, y = np.uint8([100]), np.uint8([200])
cv2.add(x, y)
cv2.subtract(x, y)
print(x + y)
print(x - y)

位操作


rectangle = np.zeros((100, 100), dtype="uint8")
cv2.rectangle(rectangle, (30, 30), (70, 70), 255, -1)
cv2.imshow("Rectangle", rectangle)

circle = np.zeros((100, 100), dtype="uint8")
cv2.circle(circle, (50, 50), 25, 255, -1)
cv2.imshow("Circle", circle)

bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)

bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)

bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)

bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT", bitwiseNot)

cv2.waitKey(0)

​ 在灰度图像素级别的布尔运算,分别对两张图片进行交集、并集、异或操作,对原型单独做了一次非操作。

Masking操作


​ Masking操作,及使用mask(起遮罩效果)可以让我们只关注图像的某一区域,可以称作为感兴趣区域。

image = cv2.imread('000.jpg') 
cv2.imshow("image", image)

mask = np.zeros(image.shape[:2], dtype="uint8")

(cX, cY) = (image.shape[1] // 2, image.shape[0] // 2)
cv2.rectangle(mask, (cX - 75, cY - 75), (cX + 75, cY + 75), 255, -1)
cv2.imshow("Mask", mask)

masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask Applied To Image", masked)
cv2.waitKey(0)

色彩通道分离与融合


​ 通道分离主要使用split方法,融合则用merge方法。

image = cv2.imread('000.jpg')
(B, G, R) = cv2.split(image)
merged = cv2.merge([B, G, R])

cv2.imshow("Red", R)
cv2.imshow("Green", G)
cv2.imshow("Blue", B)
cv2.imshow("Merged", merged)
cv2.waitKey(0)

颜色空间转换


​ 颜色空间转换主要使用cv2.cvtColor函数。

image = cv2.imread('000.jpg')
cv2.imshow("Original", image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray", gray)

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", hsv)

lab = cv2.cvtColor(image, cv2.COLOR_BGR2Luv)
cv2.imshow("L*a*b*", lab)
cv2.waitKey(0)

颜色直方图


​ OpenCV使用cv2.calcHist方法来计算直方图,参数有images、channels、mask、histSize和ranges。

plt.figure()
p1 = plt.subplot(121)
p2 = plt.subplot(122)
# Grayscale Histogram
p1.plot(hist)

chans = cv2.split(image)
colors = ("b", "g", "r")
# Color Histogram "
for (chan, color) in zip(chans, colors):
    hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
    p2.plot(hist, color=color)

plt.show()

平滑与模糊


​ 在边缘检测方面很有用处,常用的平滑方法有均值、高斯、中值、双边。

image = cv2.imread('test.jpg')

blurred = np.hstack([
    cv2.blur(image, (3, 3)),
    cv2.blur(image, (5, 5)),
    cv2.blur(image, (7, 7))])
cv2.imshow("Averaged", blurred)

blurred = np.hstack([
    cv2.GaussianBlur(image, (3, 3), 0),
    cv2.GaussianBlur(image, (5, 5), 0),
    cv2.GaussianBlur(image, (7, 7), 0)])
cv2.imshow("Gaussian", blurred)

blurred = np.hstack([
    cv2.medianBlur(image, 3),
    cv2.medianBlur(image, 5),
    cv2.medianBlur(image, 7)])
cv2.imshow("Median", blurred)

blurred = np.hstack([
    cv2.bilateralFilter(image, 5, 21, 21),
    cv2.bilateralFilter(image, 7, 31, 31),
    cv2.bilateralFilter(image, 9, 41, 41)])
cv2.imshow("Bilateral", blurred)

cv2.waitKey(0)

边缘检测


image = cv2.imread('000.jpg')
cv2.imshow("image", image)

blured = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blured = cv2.GaussianBlur(blured, (5, 5), 0)
cv2.imshow("Blurred", blured)

canny = cv2.Canny(blured, 30, 150)
cv2.imshow("Canny", canny)
cv2.waitKey(0)

​ 先转化成灰度图,然后进行平滑操作,最后使用Canny算子进行边缘检测。

摘要: 本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。 目录  [隐藏] 1 一、简介 1.1 1、OpenCV的特点 1.1.1 (1) 总体描述 1.1.2 (2) 功能 1.1.3 (3) OpenCV模块 1.2 2、有用的学习资源 1.2.1 (1) 参考手册: 1.2.2 (2) 网络资源: 1.2.3 (3) 书籍: 1.2.4 (4) 视频处理例程(在 /samples/c/): 1.2.5 (5) 图像处理例程 (在 /samples/c/): 1.3 3、OpenCV 命名规则 1.3.1 (1) 函数名: 1.3.2 (2) 矩阵数据类型: 1.3.3 (3) 图像数据类型: 1.3.4 (4) 头文件: 1.4 4、编译建议 1.4.1 (1) Linux: 1.4.2 (2) Windows: 1.5 5、C例程 2 二、GUI 指令 2.1 1、窗口管理 2.1.1 (1) 创建和定位一个新窗口: 2.1.2 (2) 载入图像: 2.1.3 (3) 显示图像: 2.1.4 (4) 关闭窗口: 2.1.5 (5) 改变窗口大小: 2.2 2、输入处理 2.2.1 (1) 处理鼠标事件: 2.2.2 (2) 处理键盘事件: 2.2.3 (3) 处理滑动条事件: 3 三、OpenCV的基本数据结构 3.1 1、图像数据结构 3.1.1 (1) IPL 图像: 3.2 2、矩阵与向量 3.2.1 (1) 矩阵: 3.2.2 (2) 一般矩阵: 3.2.3 (3) 标量: 3.3 3、其它结构类型 3.3.1 (1) 点: 3.3.2 (2) 矩形框大小(以像素为精度): 3.3.3 (3) 矩形框的偏置和大小: 4 四、图像处理 4.1 1、图像的内存分配与释放 4.1.1 (1) 分配内存给一幅新图像: 4.1.2 (2) 释放图像: 4.1.3 (3) 复制图像: 4.1.4 (4) 设置/获取感兴趣区域ROI: 4.1.5 (5) 设置/获取感兴趣通道COI: 4.2 2、图像读写 4.2.1 (1) 从文件中读入图像: 4.2.2 (2) 保存图像: 4.3 3、访问图像像素 4.3.1 (1) 假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3) 直接访问: (效率高,但容易出错) 4.3.4 (4) 基于指针的直接访问: (简单高效) 4.3.5 (5) 基于 c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1) 字节型图像的灰度-彩色转换: 4.4.2 (2) 彩色图像->灰度图像: 4.4.3 (3) 不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1) 绘制矩形: 4.5.2 (2) 绘制圆形: 4.5.3 (3) 绘制线段: 4.5.4 (4) 绘制一组线段: 4.5.5 (5) 绘制一组填充颜色的多边形: 4.5.6 (6) 文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1) 总体上: 5.1.2 (2) 为新矩阵分配内存: 5.1.3 (3) 释放矩阵内存: 5.1.4 (4) 复制矩阵: 5.1.5 (5) 初始化矩阵: 5.1.6 (6) 初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1) 假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2) 间接访问: 5.2.3 (3) 直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4) 直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): 5.2.5 (5) 对于初始化后的矩阵进行直接访问: 5.3 3、矩阵/向量运算 5.3.1 (1) 矩阵之间的运算: 5.3.2 (2) 矩阵之间的元素级运算: 5.3.3 (3) 向量乘积: 5.3.4 (4) 单一矩阵的运算: 5.3.5 (5) 非齐次线性方程求解: 5.3.6 (6) 特征值与特征向量 (矩阵为方阵): 6 六、视频处理 6.1 1、从视频流中捕捉一帧画面 6.1.1 (1) OpenCV 支持从摄像头或视频文件(AVI格式)中捕捉帧画面. 6.1.2 (2) 初始化一个摄像头捕捉器: 6.1.3 (3) 初始化一个视频文件捕捉器: 6.1.4 (4) 捕捉一帧画面: 6.1.5 (5) 释放视频流捕捉器: 6.2 2、获取/设置视频流信息 6.2.1 (1) 获取视频流设备信息:
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值