问题
- 为什么需要使用 ROI ?
- 怎么实现 ROI 的提取?
回答
- ROI 可以提取原图中感兴趣的区域来进行研究(待增加)。
- 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()
效果
以上主要涉及的函数
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文件得到的较为精准的坐标。