目录
这块我觉得没什么好说的 数字图像处理大家都知道是一个二维的灰度系数数组,彩色图片就是RGB三通道的二维数组。
一般就两种情形 第一种就是根据ROI区域坐标直接提取即可 第二种就是未知坐标
已知坐标
直接用python二维数组切片即可
#图片截图
img_part = img[0:100,0:100]
未知坐标
规则区域
利用鼠标交互提取ROI
需要运用到鼠标回调函数
先解释其中的函数
cv2.EVENT_LBUTTONDOWN: 鼠标左键按下事件
cv2.EVENT_MOUSEMOVE: 鼠标移动事件
cv2.EVENT_LBUTTONUP: 鼠标左键松开事件
cv2.rectangle(img,pt1,pt2,color): 图像上绘制矩形
- img:规定在哪个图像上绘制矩形
- pt1:矩形的左上角坐标
- pt2:矩形的右上角坐标
- color:矩形框颜色 BGR表示
- thickness:可选参数 设置矩形框厚度 如果不指定该参数,则默认值为 1。如果该参数为负数,则会绘制一个填充的矩形。
- lineType: 可选参数,用于指定矩形边框的类型。可以是
cv2.LINE_4,
cv2.LINE_8
或cv2.LINE_AA
中的一个。如果不指定该参数,则默认值为cv2.LINE_8
。 - shift:可选参数,用于指定坐标中小数点的位置。如果不指定该参数,则默认值为 0。
cv2.setMouseCallback(string, function, src) :用于设置鼠标回调函数
- string: 窗口名称
- function:鼠标回调函数
- src: 鼠标回调函数所需的额外参数
import cv2
roi = None #ROI区域
startPoint = None #截图开始点
dragging = False #是否处于拉取状态
def OnMouse(event,x,y,flags,param):
global roi,startPoint,dragging
img = param
if event == cv2.EVENT_LBUTTONDOWN:
startPoint = (x,y)
dragging = True
elif event == cv2.EVENT_MOUSEMOVE and dragging:
imgCopy = img.copy()
cv2.rectangle(imgCopy,startPoint,(x,y),(0,255,0))
cv2.imshow('Image',imgCopy)
elif event == cv2.EVENT_LBUTTONUP:
roi = (startPoint[0],startPoint[1],x-startPoint[0],y-startPoint[1])
dragging = False
src = cv2.imread("StarSky.jpg")
cv2.imshow("Image",src)
cv2.setMouseCallback("Image", OnMouse, src)
while roi is None:
cv2.waitKey(50)
x, y, w, h = roi
roiImg = src[y:y+h, x:x+w]
cv2.imshow("ROI", roiImg)
cv2.waitKey(0)
效果
不规则区域
这个时候需要运用到掩码(mask)来划分出自己感兴趣的区域
圆形
np.zeros: 创建一个全零的数组
- shape:数组的形状,指定数组的大小
- dtype:可选参数,用于指定数组元素的数据类型。如果不指定该参数,则默认值为float64
cv2.circle(img,center,radius,color,thickness,lineType,shift): 绘制一个圆形
- img:在哪个图像上绘制圆形
- center:圆的中心位置
- radius:圆的半径
- color:圆边的颜色 BGR
- thickness:可选参数,用于指定圆边框的厚度。如果不指定该参数,则默认值为 1。如果该参数为负数,则会绘制一个填充的圆
- lineType: 可选参数,用于指定圆边框的类型。可以是
cv2.LINE_4
、cv2.LINE_8
或cv2.LINE_AA
中的一个。如果不指定该参数,则默认值为cv2.LINE_8
- shift:可选参数,用于指定坐标中小数点的位置。如果不指定该参数,则默认值为 0
cv2.bitwise_and(src1,src2,mask):用于计算两个数组的按位与
- src1:第一个输入数组。
- src2:第二个输入数组。
- mask:可选参数,用于指定掩码。如果指定了掩码,则只有掩码中非零的位置才会被计算。
- dst:可选参数,用于指定输出数组。如果不指定该参数,则会创建一个新的数组来存储输出结果
import cv2
import numpy as np
src = cv2.imread("StarSky.jpg")
mask = np.zeros(src.shape[:2],dtype=np.uint8)
cv2.circle(mask,(100,100),50,255,-1)
roi = cv2.bitwise_and(src,src,mask=mask)
cv2.imshow("ROI", roi)
cv2.waitKey(0)
效果
多边形
多边形可以使用cv2.fillPoly来填充一个多边形 以五边形为例子
cv2.fillPoly(src,pts,dst)
- src:在哪张图像上绘制多边形
- pts:多边形顶点的数组,每个多边形由一组顶点表示。顶点坐标必须是整数。
- color:多边形边框颜色
- lineType:可选参数,用于指定多边形边框的类型。可以是
cv2.LINE_4
、cv2.LINE_8
或cv2.LINE_AA
中的一个。如果不指定该参数,则默认值为cv2.LINE_8
。 - shift:可选参数,用于指定坐标中小数点的位置。如果不指定该参数,则默认值为 0。
- offset:可选参数,用于指定多边形顶点坐标的偏移量。如果不指定该参数,则默认值为
(0, 0)
src = cv2.imread("StarSky.jpg")
pts = np.array([[10, 50], [20, 50], [25, 100], [20, 150], [10, 150]])
mask = np.zeros(src.shape[:2],np.uint8)
cv2.fillPoly(mask,[pts],255)
roiImage = cv2.bitwise_and(src,src,mask=mask)
cv2.imshow("ROI", roiImage)
cv2.waitKey(0)
效果
其他方法
- 使用图像分割算法来自动提取 ROI 区域。这种方法可以用来处理更复杂的图像,但需要更多的计算资源。
- 使用图像处理技术(如阈值化、边缘检测、形态学操作等)来预处理图像,然后使用轮廓检测算法来提取 ROI 区域。
- 使用机器学习算法(如目标检测、语义分割等)来自动提取 ROI 区域。这种方法需要大量的训练数据,并且需要更多的计算资源。