美文网首页
使用Opencv实现ROI(region of interest

使用Opencv实现ROI(region of interest

作者: 小小老书童 | 来源:发表于2020-07-04 19:41 被阅读0次

问题

    1. 为什么需要使用 ROI ?
    1. 怎么实现 ROI 的提取?

回答

    1. ROI 可以提取原图中感兴趣的区域来进行研究(待增加)。
    1. ROI 的提取方法有很多种,个人更倾向于使用mask来进行。

基于Python的Opencv实现方法

import cv2 as cv
import numpy as np


def ROI_Select_demo(image):
    h,w = image.shape[:2]
    mask = np.zeros((h,w),dtype = np.uint8)
    x_data = np.array([101, 102, 201, ... ,])
    y_data = np.array([20, 30, 40, ...,])
    pts = np.vstack((x_data, y_data)).astype(np.int32).T #函数np.vstack()
    cv.fillPoly(mask, [pts], (255), 8, 0)    #函数cv.fillPoly(img,pts,color,lineType=None,shift=None,offset=None)
    cv.imshow("mask", mask)
    result = cv.bitwise_and(image, image, mask = mask)  #函数cv.bitwise_and(src1, src2,dst=None,mask=None)
    cv.imshow("result", result)


if __name__ ==  "__main__":
    src = cv.imread("图片路径")
    cv.imshow("input_image", src)
    ROI_Select_demo(src)    #调用函数
    cv.waitKey(0)
    cv.destroyAllWindows()

效果

image.png
image.png
image.png
以上主要涉及的函数

1.np.vstack() 主要是实现坐标读取顺序的问题,这个函数是垂直(行顺序)读取,.T是进行简单转置。
补充:np.hstack(),水平方向

2.cv.fillPoly(img,pts,color,lineType=None,shift=None,offset=None) 用于一个单独被多边形轮廓所限定的区域内进行填充;参数img:表示填充的图像;pts:多边形数组;color:表示填充的颜色;lineType:线条类型;shift:坐标的精确位数;offset:偏移量。
补充:函数cv.fillConvexPoly()可以用来填充凸多边形,该函数的多边形绘制速度要快于cv.fillPoly()。具体的可以参考opencv官方介绍。

3.cv.bitwise_and(src1, src2,dst=None,mask=None):bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0;
补充:bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1or1=1,1or0=0,0or1=0,0or0=0
bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,not1=0,not0=1

关于图上坐标的确认:

我是使用Labelme来获取的,通过打开json文件得到的较为精准的坐标。

欢迎大家的修正和讨论!也感谢网上资料的共享!

相关文章

网友评论

      本文标题:使用Opencv实现ROI(region of interest

      本文链接:https://www.haomeiwen.com/subject/vwxpqktx.html