opencv使用方法
一、基本方法使用(opencv)
1.图片裁切
1.1 实现逻辑
图像都可转为三维数组,只不过彩色图片的颜色通道有三个(BGR),
灰度为一个通道,也可以直接在读取图片时指定读取灰色图片cv2.IMREAD_GRAYSCALE
使用imread()方法打开的图片,打开的三维数组,最里面的[]代表某个像素点的颜色
在三维数组中,每一层列表代表图像的一行,每个元素代表该行中的一个像素。每个像素由三个数值组成,分别表示蓝、绿、红三个通道的强度值(BGR顺序)。
[
[[0,0,0], [1,1,1]] # 最里面的[B,G,R]
]
同时,三个通道BGR对应的下标为0,1,2
1.2 使用方法
- cv2.imread() # 打开图片 可以指定cv2.imread(cv2.IMREAD_GRAYSCALE)打开灰色图
- cv2.imshow() # 显示图像
- cv2.waitKey() # 等待键盘事件关闭图像窗口,0代表无限长时间
- cv2.destroyAllWindows() # 关闭已创建的窗口图像
1.3代码示例
import cv2
img = cv2.imread("../static/cat1.webp")
cat = img[0:500, 0:600]
cv2.imshow("cat", cat)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.颜色通道提取与合并
2.1 使用方法
- b, g, r = cv2.split(img) # 分离三个颜色通道
- red_img = img.copy() # 复制数组
- img.shape() # 返回图像形状(height, wideth, channels)
- cv2.merge((b,g,r)) # 合并颜色通道
2.2 代码示例
import cv2
img = cv2.imread("./cat1.webp")
b, g, r = cv2.split(img)
red_img = img.copy()
height = red_img.shape[0]
red_img[:height//2, :, 2] = 0 # 表示第三个颜色通道所有像素点
red_img[:, :, 1] = 0
3.边界填充
ps: 一个400400的图像,通过边缘反射或填充黑边方法将图片增大至500500
4.数值计算
4.1 使用方法
- img = cv2.imread() # 读取图片
- img2 = img + 10 # 相当于每个像素点的数值都加10
- img3 = img2 + img # 如果同一个像素点的数值大于255,那么就用img3 % 255,结果为余数
- img4 = cv2.add(img, img2) # 也是同像素点相加,不同于上方法数值大于255后取余,这个相加后的的结果也是0~255区间,大于255的也改为255
5.读取视频流
5.1 使用方法
5.2 代码实例
import cv2
# 读取视频
vc = cv2.VideoCapture('../static/test.mp4')
#检查是否打开正确
if vc.isOpened():
oepn,frame = vc.read()
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("result", gray)
if cv2.waitKey(100) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
2.图片形态学
2.1腐蚀操作
2.1.1 实现逻辑
先使用numpy得到一个正方形矩阵(腐蚀核),将这个正方形矩阵滑动输入图像,
将矩阵内的像素点值替换,实现腐蚀操作的基本思想是将每个像素点的值替换为该像素周围像素的最小值。这样,对于前景(白色)像素,其周围的黑色像素会一步一步地侵蚀前景区域,从而缩小前景对象的大小
ps: 将有价值的东西变得越来越少
2.1.2 函数方法介绍
- cv2.erode() 方法用于腐蚀操作。它的第一个参数是要进行腐蚀操作的图像,第二个参数是腐蚀核,也称为结构元素。结构元素是一个矩阵,它定义了要应用于输入图像的腐蚀算法。第三个参数是迭代次数,表示要重复应用腐蚀算法的次数。
- cv2.imshow() 方法用于显示图像。它需要两个参数:窗口名称和要显示的图像。
- cv2.waitKey() 方法用于等待键盘输入。它等待指定的毫秒数,并在此期间等待用户按下某个键。如果用户按下了某个键,则返回该键的 ASCII 码值。否则,返回 -1。
- cv2.destroyAllWindows() 方法用于销毁所有的窗口。
2.1.3 代码实例
import cv2
import numpy as np
dog = cv2.imread("./dog.png")
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(dog, kernel, iterations=3)
cv2.imshow("erosion", erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2膨胀操作
ps: 膨胀操作是形态学处理中的一种常见操作,可用于去除小的噪点、
连接断开的边缘、拓宽图像中的线条等
2.2.1 函数方法介绍
- cv2.dilate(img, kernel, iterations) # 接收三个参数,输入图像(img)、膨胀核(kernel)和迭代次数(iterations)
2.2.2 代码实例
import cv2
import numpy as np
img = cv2.imread("../static/bai_yuan.png")
kernel = np.ones((50, 50), np.uint8)
erosion = cv2.dilate(img, kernel, iterations=1)
cv2.imshow("erosion", erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3 开运算与闭运算
2.3.1 函数方法介绍
- 开运算:先腐蚀,后膨胀
- 闭运算:先膨胀,后腐蚀
- cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
- 运算操作
- cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
- src:输入图像。
- op:需要进行的形态学操作,可以是以下值之一:
- cv2.MORPH_ERODE:腐蚀操作。
- cv2.MORPH_DILATE:膨胀操作。
- cv2.MORPH_OPEN:开运算操作。
- cv2.MORPH_CLOSE:闭运算操作。
- cv2.MORPH_GRADIENT:形态学梯度操作。
- cv2.MORPH_TOPHAT:顶帽操作。
- cv2.MORPH_BLACKHAT:黑帽操作。
- kernel:用于元素的结构化元素。
- dst:输出图像。
- anchor:锚点位置,默认为(-1,-1)。
- iterations:操作的迭代次数。
- borderType:边界处理方式。
- borderValue:边界值。
2.3.2 代码实例
import numpy as np
import cv2
img = cv2.imread("../static/bai_yuan.png")
kernel = np.ones((100, 100), np.uint8)
erosion = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 开运算
# erosion = cv2.morphologyEx(img, cv2.MORPH