大家好,今天分享这篇文章主要介绍了OpenCV基本操作中的图像基础操作,
希望对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考。
读取图片
imread 功能是加载图像文件成为一个 Mat 对象。
第一个参数表示图像文件名称。
第二个参数表示加载的图像是什么类型,支持常见的三个参数值
-
IMREAD_UNCHANGED(<0) 表示加载原图,不做任何改变
-
IMREAD_GRAYSCALE(0) 表示把原图作为灰度图像加载进来
-
IMREAD_COLOR(>0) 表示把原图作为 RGB 图像加载进来
注意:OpenCV 支持 JPG、PNG、TIFF 等常见格式图像文件加载(默认读取的格式是 BGR)
import cv2
# 读取图像
image = cv2.imread("E:image.png")
# 打印形状,类型,和具体对象
print(image.shape,type(image),image)
输出结果如下:
(419, 691, 3) <class 'numpy.ndarray'> [[[ 92 103 57]
[ 87 98 52]
[ 86 98 50]
...
[ 69 70 30]
[ 69 71 35]
[ 74 75 41]]]
可以发现这是个 numpy 数据类型的,而且是三个维度的,比如 [H,W,C]
显示图像
imread功能是显示图像。
第一个参数表示显示图像描述信息
第二个参数为imread的Mat对象。
# 获取加载原图灰度
image = cv2.imread('E:image.png')
# 图像的显示,也可以创建多个窗口
cv2.imshow("mmimage",image)
# 等待时间,毫秒级,0 表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
会出现一个弹窗,显示一张图片。
输出:(按下任意键关闭该窗口)
图片灰度化
# 获取加载原图灰度
image = cv2.imread('E:image.png',cv2.IMREAD_GRAYSCALE)
# 图像的显示,也可以创建多个窗口
cv2.imshow("Image",image)
# 等待时间,毫秒级,0 表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
在新弹出窗口显示一张已灰度化处理的图片。
颜色空间转换
上面提取图片灰度,也可以通过颜色空间转化函数。
cvtColor函数是进行图片颜色空间转换的
第一个参数是输入图像,通过imread读取的图像。
第二个参数是颜色空间转换的标志,支持下面几种类型:
-
COLOR_BGR2GRAY 表示BGR转换为灰度图 (Grayscale)
-
COLOR_BGR2HSV 表示把BGR颜色空间转换为HSV颜色空间
-
COLOR_BGR2RGB 表示把BGR转换为RGB
-
COLOR_GRAY2BGR 表示把灰度转换为BGR
-
COLOR_HSV2BGR 表示把HSV转换为BGR
# 图片灰度化也可以cvtColor函数,
# 这样好处就是原图用于其它操作,不会影响
image = cv2.imread('E:image.png')
# 不同颜色空间之间进行转换,转换灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 图像的显示,也可以创建多个窗口
cv2.imshow("gray_image",gray_image)
cv2.imshow("orgin_image",image)
# 等待时间,毫秒级,0 表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
会出现两个弹窗图片,一个是原始图,一个是灰度处理后的。
裁剪部分图像数据
前面我们看到加载的图片为numpy.narray类型。这样就可以直接作为切片进行处理了。
import cv2
# 读取图像
image = cv2.imread('E:image.png')
# 取出图像的一半
cut_image = image[:image.shape[0] // 2,:image.shape[1] // 2]
# 显示裁剪后的图片
cv2.imshow("cut_image",cut_image)
# 等待时间,毫秒级,0 表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
颜色通道提取
通过 cv2 的 split() 方法可以进行颜色的通道提取。
# 导入 OpenCV 库
import cv2
image = cv2.imread('E:image.png')
# 颜色提取
b,g,r = cv2.split(image)
# 输出
g
输出效果如下:
rray([[103, 98, 98, ..., 112, 111, 112],
[102, 97, 96, ..., 111, 111, 112],
[100, 94, 92, ..., 111, 111, 113],
...,
[ 81, 79, 83, ..., 73, 72, 72],
[ 80, 82, 79, ..., 72, 72, 71],
[ 78, 78, 78, ..., 70, 71, 75]], dtype=uint8)
上面说过 OpenCV 默认读取的格式是 BGR.也可通过切片操作修改。
# 导入 OpenCV 库
import cv2
image = cv2.imread('E:image.png')
# 复制图片
cur_img = image.copy()
# 注意参数的变化,仅保留G
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
# 仅保留B
# cur_img[:,:,1] = 0
# cur_img[:,:,2] = 0
# 仅保留R
# cur_img[:,:,0] = 0
# cur_img[:,:,1] = 0
# 输出仅有G的颜色图片
cv2.imshow('G',cur_img)
# 等待时间,毫秒级,0 表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
G 是 Green 的缩写,这里显示的是绿色。
数值计算
在前面我们讲numpy的时候讲过它有广播的功能,不消耗内存进行数值运算。
如果不了解,看一下我前面的文章《数据科学初学者必知的Python第三方库NumPy》有相应介绍。
导入 OpenCV 库
import cv2
image = cv2.imread('E:image.png')
# 数值运算
image1 = image + 30
# 过长,我就简单截取
print(image[:5,:,0])
print(image1[:5,:,0])
cv2.imshow('cal',image1)
# 等待时间,毫秒级,0 表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
输出内容如下:
[[92 87 86 ... 72 69 70]
[90 85 84 ... 71 71 70]
[88 82 82 ... 73 71 70]
[87 82 79 ... 73 71 70]
[84 83 77 ... 73 71 70]]
[[122 117 116 ... 102 99 100]
[120 115 114 ... 101 101 100]
[118 112 112 ... 103 101 100]
[117 112 109 ... 103 101 100]
[114 113 107 ... 103 101 100]]
图片image1的每个值都做了+30的操作。
如果超过RGB颜色范围255的话:新颜色 = 原有颜色值 + 30 - 255
图像融合
addWeighted 函数用于将两个图像进行加权相加,生成一个新的图像。
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
-
src1:第一个输入图像。
-
alpha:第一个图像的权重。
-
src2:第二个输入图像。
-
beta:第二个图像的权重。
-
gamma:图像融合中的常量。
需要融合的两张图像,把美女放到相框中去如下:
import cv2
import matplotlib.pyplot as plt # 这个库是用来画图的
#这是jupyter notebook里的命令, 意思是将那些用matplotlib绘制的图显示在页面里而不是弹出一个窗口
%matplotlib inline
image_xk = cv2.imread('xk.jpg')
image_mn = cv2.imread('mv.jpg')
# 将两张图像横向拼接
result = np.hstack((image_xk, image_mn))
plt.imshow(result)
plt.show()
# 如果两个图片长宽相同才可以这么相加
result = image_xk +image_mn
print(result)
说明:image_mn和image_xk的我选择的图片都是512 * 512的,所以不需要转化。
如果图片大小不同是需要做裁剪的。美女图片过大,那我们可以裁剪和相框大小的宽高。
image_mn1 = cv2.resize(image_mn,image_xk.shape)
下面是融合2张图片的代码:
# 定义权重
alpha = 0.6
beta = 0.4
gamma = 0
# 使用addWeighted函数将两个图像进行加权相加
image_weight = cv2.addWeighted(image_mn, alpha, image_xk, beta, gamma)
plt.imshow(image_weight)
plt.show()
图像保存
图像的保存非常简单,只需要使用 imwrite() 方法即可将图像保存起来:
import cv2
import matplotlib.pyplot as plt # 这个库是用来画图的
# 读取灰度化图像
image_gray= cv2.imread("mv.jpg",cv2.IMREAD_GRAYSCALE)
# 图像保存
# 第一个参数是图像要保存的路径,第二个图像是要保存的图像
cv2.imwrite("mn_gray.jpg",image_gray)
保存的灰度图像:
数据读取-视频
VideoCapture是 OpenCV 库中用于捕获视频的类。它可以用来从视频文件、摄像头或其他类似源中捕获帧。这个类允许你以帧的形式访问视频的每个时间点,并对这些帧进行处理或分析。
在 Python 中,可以使用 cv2.VideoCapture() 创建一个 VideoCapture 对象,语法如下:
capture = cv2.VideoCapture(index or filename)
-
index: 代表要打开的摄像头的索引号,如果只有一个摄像头则为 0 或 -1。
-
filename: 代表要读取的视频文件的名称。
基本操作 一旦创建了 VideoCapture 对象,你可以使用一些方法和属性来操作视频流:
-
capture.isOpened(): 检查是否成功打开视频流。
-
capture.read(): 读取视频帧。返回一个布尔值(是否成功读取)和一个帧。
-
capture.grab(): 从视频流中抓取下一帧,但不解码。
-
capture.retrieve(): 解码并返回抓取的帧。
-
capture.release(): 释放 VideoCapture 对象占用的资源。
运行下面这段代码,有惊喜等着你呢!
import cv2
# 打开摄像头
capture = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not capture.isOpened():
print("无法打开摄像头")
while True:
# 读取一帧
ret, frame = capture.read()
# 如果成功读取帧
if ret:
# 在窗口中显示帧
cv2.imshow('Video', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源并关闭窗口
capture.release()
cv2.destroyAllWindows()
下载1:Opencv电子书 公众号后台回复:opencv,即可下载搜集的基本opencv教程电子书。 下载2:Python电子书 公众号后台回复:python,即可下载为您整理的将近100本电子书。
原文始发于微信公众号(程序员老朱):OpenCV图像基本操作讲解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论