1. 实验1 图像的基本操作
1.1. 学习目标
- 掌握图像的读取和保存方法
- 能够使用
OpenCV
在图像上绘制几何图形 - 能够访问图像的像素
- 能够获取图像的属性,并进行通道的分离和合并
- 能够实现颜色空间的变换
1.2. 实验内容
1.2.1. 图像的IO操作
显示图像、保存图像
import numpy as np import cv2 as cv # 以灰度图的形式读取图像 img = cv.imread('messi5.jpg',0)
# opencv中显示 cv.imshow('image',img) cv.waitKey(0) # matplotlib中展示 plt.imshow(img[:,:,::-1])
保存图像
cv.imwrite('messigray.png',img)
1.2.2. 绘制几何图形
绘制直线
cv.line(img,start,end,color,thickness)
参数:
img
:要绘制直线的图像Start,end
: 直线的起点和终点color
: 线条的颜色Thickness
: 线条宽度
绘制圆形
cv.circle(img,centerpoint, r, color, thickness)
参数:
img
:要绘制圆形的图像Centerpoint, r
: 圆心和半径color
: 线条的颜色Thickness
: 线条宽度,为-1时生成闭合图案并填充颜色
绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)
参数:
img
:要绘制矩形的图像Leftupper, rightdown
: 矩形的左上角和右下角坐标color
: 线条的颜色Thickness
: 线条宽度
1.2.3. 在图像中添加文字
cv.putText(img,text,station, font,fontsize,color,thickness,cv.LINE_AA)
参数:
img
: 图像text
:要写入的文本数据station
:文本的放置位置font
:字体Fontsize
:字体大小
1.2.4. 获取并修改图像中的像素点
可以通过行和列的坐标值获取该像素点的像素值。对于BGR
图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。使用相同的方法对像素值进行修改。
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
# 获取某个像素点的值
px = img[100,100]
# 仅获取蓝色通道的强度值
blue = img[100,100,0]
# 修改某个位置的像素值
img[100,100] = [255,255,255]
1.2.5. 获取图像的属性
图像属性包括行数,列数和通道数,图像数据类型,像素数等。
属性 | API |
---|---|
形状 | img.shape |
图像大小 | img.size |
数据类型 | img.dtype |
1.2.6. 图像通道的拆分与合并
有时需要在B,G,R
通道图像上单独工作。在这种情况下,需要将BGR
图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR
图像。你可以通过以下方式完成。
# 通道拆分
b,g,r = cv.split(img)
# 通道合并
img = cv.merge((b,g,r))
1.2.7. 色彩空间的改变
OpenCV
中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR↔Gray和BGR↔HSV
。
cv.cvtColor(input_image,flag)
参数:
input_image
: 进行颜色空间转换的图像flag
: 转换类型cv.COLOR_BGR2GRAY : BGR↔Gray
cv.COLOR_BGR2HSV: BGR→HSV
1.3. 实验步骤
按照以上实验内容,对images文件夹
的图像进行以下,并截图和记录实验结果
- 读取图像
- 在图像上绘制圆形和正方形
- 在图像上写上自己的学号和姓名
- 打印出图像的属性,包括图像大小、图像像素类型
- 将图像进行拆分为3个不同通道的单通道图像,并对其中一个通道的灰度图像进行如下操作
- 改变图像中(50~100,50~100)位置的像素点的灰度值
- 合并以上分解的图像
- 将最终的截图保存。