Python OpenCV1:OpenCV 图像基本操作

本文介绍了OpenCV库的基本使用,包括图像的读取、显示和保存,以及如何绘制几何图形、修改像素点、获取图像属性、拆分与合并图像通道。此外,还展示了如何进行色彩空间转换,如从BGR到灰度和HSV。通过实例代码详细解释了每个操作步骤。
摘要由CSDN通过智能技术生成

1. OpenCV

OpenCV 是一个用于计算机视觉处理的开源软件库。 它支持许多与计算机视觉和机器学习相关的算法,并且在日益扩大。 OpenCV 是基于 C++ 实现的。 OpenCV-Python 是 OpenCV 的 Python API,它结合了 OpenCV C++ API 和 Python 语言的最佳特性。 OpenCV 提供了完整的传统计算机视觉算法,涵盖了主流机器学习算法,同时增加了对深度学习的支持。

import cv2 as cv

2. 图像的IO操作

2.1 读取图像

cv.imread("filename", arg) 读取图像

arg:

1(cv.IMREAD*COLOR) 以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。

0(cv.IMREAD*GRAYSCALE) 以灰度模式加载图像

-1(cv.IMREAD_UNCHANGED) 包括alpha通道的加载图像模式。

在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。注意OpenCV中图像颜色的3个通道顺序为BGR。

另外我们也可使用matplotlib对图像进行展示,此时需要先将图像3个通道反转为RGB再输出。

plt.imshow(img[:, :, ::-1]) 将img3个通道反转后显示

2.2 显示图像

cv.imshow(img, "窗口名称") 显示图像

2.3 保存图像

cv.imwrite("filepath、filename", img) 保存图像

例1:读取并显示image/balloon.jpeg图像,并保存图像。

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread("image/balloon.jpeg", 1)

# 显示图像
# OpenCV显示图像 BGR
cv.imshow("balloon", img)
# 按任意键继续
cv.waitKey(0)
cv.destroyAllWindows()

# matplotlib显示图像 RGB
plt.imshow(img[:, :, ::-1])
plt.show()

# 保存图像
cv.imwrite("image/balloon2.png", img)

输出:

OpenCV输出会弹出一个对话框:

matplotlib在plots界面中输出:

3. 绘制几何图形

3.1 绘制直线

cv.line(img,start,end,color,thickness) 绘制直线

参数:

img 要绘制直线的图像

start,end 直线的起点和终点

color 线条的颜色

thickness 线条宽度

3.2 绘制圆形

cv.circle(img,centerpoint, r, color, thickness) 绘制圆形

参数:

img 要绘制圆形的图像

centerpoint 圆心

r 半径

color 线条的颜色

thickness 线条宽度,为-1时生成闭合图案并填充颜色

3.3 绘制矩形

cv.rectangle(img,leftupper,rightdown,color,thickness) 绘制矩形

参数:

img 要绘制矩形的图像

leftupper, rightdown 矩形的左上角和右下角坐标

color 线条的颜色

thickness 线条宽度

3.4 向图像中添加文字

cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)

参数:

img 图像

text 要写入的文本数据

station 文本的放置位置

font 字体

fontsize 字体大小

例2:生成一个全黑的图像,在上面应用上述函数。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 创建512*512全黑图像 3通道
img = np.zeros((512, 512, 3), np.uint8)

# 绘制图形
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
cv.circle(img, (256, 256), 60, (0, 0, 255), -1)
cv.rectangle(img, (100, 100), (400, 400), (0, 255, 0), 5)
cv.putText(img, "opencv", (10, 150), cv.FONT_HERSHEY_COMPLEX, 3, (255, 255, 255), 3)

# 显示结果
plt.imshow(img[:, :, ::-1])
plt.show()

输出:

4. 获取和修改图像上的像素点

像素的像素值可以通过行和列的坐标值获得。 对于 BGR 图像,它返回蓝色、绿色和红色值的数组。 对于灰度图像,只返回相应的强度值。 使用相同的方法修改像素值。

使用 NumPy 的索引方法获取和修改。

5. 获取图像的属性

img.shape 形状

img.size 图像大小

img.dtype 数据类型

例3:读取、修改一个图像中某个点的像素值,读取形状、大小、数据类型。

import numpy as np

# 生成黑色图像
img = np.zeros((256, 256, 3), np.uint8)
# 获取100, 100像素点的值
print(img[100, 100])
# 获取蓝色通道的强度值
print(img[100, 100, 0])
# 修改100, 100位置的像素值
img[100, 100] = (0, 0, 255)
print(img[100, 100])

print(img.shape)
print(img.dtype)
print(img.size)

输出:

[0 0 0]
0
[  0   0 255]
(256, 256, 3)
uint8
196608

6. 图像通道的拆分与合并

在图像处理过程中,有时需要单独处理B、G、R通道图像。 在这种情况下,需要将 BGR 图像分成 3 个单通道。 我们还可以将这些单独的通道合并为 BGR 图像。

b,g,r = cv.split(img) 通道拆分

img = cv.merge((b,g,r)) 通道合并

 例4:将图像的通道进行拆分与合并。

import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt

font = {
    "family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)

balloon = cv.imread("./image/balloon.jpeg")
b, g, r = cv.split(balloon)
plt.imshow(b, cmap=plt.cm.gray)
plt.title("B通道以灰度图显示")
plt.show()

img2 = cv.merge((b, g, r))
plt.imshow(img2[:, :, ::-1])
plt.title("合并后的原图像")
plt.show()

输出:

7. 色彩空间的改变

OpenCV中有很多色彩空间转换方法。 有两种最广泛使用的转换方法,BGR↔Gray 和 BGR↔HSV。

cv.cvtColor(input_image, flag)

参数:

input_image 进行颜色空间转换的图像

flag 转换类型:

cv.COLOR_BGR2GRAY : BGR↔Gray

cv.COLOR_BGR2HSV: BGR→HSV

例5:将图像转换为灰度图和HSV图。

import cv2 as cv
import matplotlib
from matplotlib import pyplot as plt

font = {
    "family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)

balloon = cv.imread("./image/balloon.jpeg")

gray = cv.cvtColor(balloon, cv.COLOR_BGR2GRAY)
plt.imshow(gray, cmap=plt.cm.gray)
plt.title("转换为灰度图")
plt.show()

hsv = cv.cvtColor(balloon, cv.COLOR_BGR2HSV)
plt.imshow(hsv)
plt.title("转换为HSV图")
plt.show()

输出:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hinomoto Oniko

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值