[opencv教程(三)]ROI区域(图片截取)

目录

已知坐标

未知坐标

规则区域

效果

不规则区域

圆形

效果

多边形

效果

其他方法


这块我觉得没什么好说的 数字图像处理大家都知道是一个二维的灰度系数数组,彩色图片就是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_4cv2.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_4cv2.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 区域。这种方法需要大量的训练数据,并且需要更多的计算资源。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值