【利用python-OpenCV截取LiTS2017数据集标签中的局部区域作为稀疏标记】

利用python-OpenCV截取LiTS2017数据集标签中的局部区域作为稀疏标记。

1、什么是连通域。

连通区域一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域。连通区域分析是指将图像中的各个连通区域找出并标记。
连通区域分析是一种在图像分析处理的众多应用领域中较为常用和基本的方法。例如:OCR识别中字符分割提取(车牌识别、文本识别、字幕识别等)、视觉跟踪中的运动前景目标分割与提取(行人入侵检测、遗留物体检测、基于视觉的车辆检测与跟踪等)、医学图像处理(感兴趣目标区域提取)、等等。也就是说,在需要将前景目标提取出来以便后续进行处理的应用场景中都能够用到连通区域分析方法,通常连通区域分析处理的对象是一张二值化后的图像。

2、函数介绍。

2.1 cv2.connectedComponentsWithStats():

这个函数的作用是对一幅图像进行连通域提取,并返回找到的连通域的信息:retval、labels、stats、centroids.

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8, ltype=None)

参数介绍:

image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
connectivity:可选值为4或8,也就是使用4连通还是8连通。
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。 返回值:
返回值:
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积,示例如下: 0 0 720 720 291805
centroids:连通域的中心点

2.2 cv2.findContours()

image,contours,hierarchy = cv2.findContours(contour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

参数介绍:

输入:
contour:带有轮廓信息的图像;
cv2.RETR_TREE:提取轮廓后,输出轮廓信息的组织形式,除了cv2.RETR_TREE还有以下几种选项:
cv2.RETR_EXTERNAL:输出轮廓中只有外侧轮廓信息;
cv2.RETR_LIST:以列表形式输出轮廓信息,各轮廓之间无等级关系;
cv2.RETR_CCOMP:输出两层轮廓信息,即内外两个边界(下面将会说到contours的数据结构);
cv2.RETR_TREE:以树形结构输出轮廓信息。
cv2.CHAIN_APPROX_SIMPLE:指定轮廓的近似办法,有以下选项:
cv2.CHAIN_APPROX_NONE:存储轮廓所有点的信息,相邻两个轮廓点在图象上也是相邻的;
cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标;
cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法保存轮廓信息。
输出:
python3里返回三个值:image,contours,hierarchy
image:可能是跟输入contour类似的一张二值图;
contours:list结构,列表中每个元素代表一个边沿信息。每个元素是(x,1,2)的三维向量,x表示该条边沿里共有多少个像素点,第三维的那个“2”表示每个点的横、纵坐标;
注意:如果输入选择cv2.CHAIN_APPROX_SIMPLE,则contours中一个list元素所包含的x点之间应该用直线连接起来,这个可以用cv2.drawContours()函数观察一下效果。
hierarchy:返回类型是(x,4)的二维ndarray。x和contours里的x是一样的意思。如果输入选择cv2.RETR_TREE,则以树形结构组织输出,hierarchy的四列分别对应下一个轮廓编号、上一个轮廓编号、父轮廓编号、子轮廓编号,该值为负数表示没有对应项。

3、实现代码:

// An highlighted block
lab_path = r'./segmentation-1-18.npy'
lab = np.load(lab_path)
lab[lab==1]=0
lab[lab==2]=1
plt.imshow(lab, cmap='gray')
plt.show()

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(lab, connectivity=8)
print(stats)
lab_c = lab.copy()
lab = (255.0*lab).astype(np.uint8)
lab = cv2.cvtColor(lab, cv2.COLOR_GRAY2RGB)
bk = np.zeros_like(lab_c)
for area in stats[1:]:
    startx, starty, width, height,_ = list(area)
    centerx, centery = startx+width//2, starty+height//2
    print(centerx, centery, width, height)
    if min(width, height) < 15:
        r = min(width, height)//3
    else:
        r = min(width, height)//4
    cv2.circle(bk, (centerx, centery), r, 1, -1)
    bitwiseAnd = cv2.bitwise_and(lab_c, bk)
    # print(np.unique(bitwiseAnd))
    # fuse = lab_c + bitwiseAnd
    # plt.imshow(fuse, cmap='gray')
    # plt.show()

    contours2, _ = cv2.findContours(bitwiseAnd, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(lab, contours2, -1, (255, 0, 0), -1)
    plt.imshow(lab)
    plt.savefig('sparse_labeld.png', dpi=800, bbox_inches='tight')
    plt.show()

原始标注图像
在这里插入图片描述
渲染后的稀疏标注
渲染后的稀疏标注图像

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用python-opencv调用mjpg-stream视频流可以通过以下几个步骤实现: 1. 首先,我们需要安装python-opencv库。可以使用pip命令进行安装,如下所示: ``` pip install opencv-python ``` 2. 导入所需的库。我们需要导入opencv模块,以及用于从URL读取视频流的模块urllib.request。代码如下: ```python import cv2 import urllib.request ``` 3. 定义视频流的URL。根据实际情况,将URL替换为相应的mjpg-stream视频流的URL。代码如下: ```python stream_url = "http://example.com/stream/video.mjpg" ``` 4. 使用urllib.request.urlopen()方法打开视频流URL,并读取其的数据。代码如下: ```python stream = urllib.request.urlopen(stream_url) ``` 5. 使用cv2.VideoCapture()方法创建一个视频捕获对象,然后使用read()方法从视频流读取每一帧图像数据。代码如下: ```python capture = cv2.VideoCapture(stream) ret, frame = capture.read() ``` 6. 在一个循环,不断读取视频流的每一帧图像数据,然后进行后续的处理。例如,可以显示图像、保存图像等。代码如下: ```python while True: ret, frame = capture.read() cv2.imshow("Video Stream", frame) # 处理图像数据的其他操作 if cv2.waitKey(1) == ord('q'): break capture.release() cv2.destroyAllWindows() ``` 在以上步骤,我们首先安装了python-opencv库,然后导入所需的库,之后定义了视频流的URL。接着,通过urllib.request库打开视频流URL,并创建了一个视频捕获对象。最后,利用一个循环读取每一帧图像数据,并进行相应的处理,例如显示图像或保存图像。最后,释放资源并关闭窗口。 以上就是使用python-opencv调用mjpg-stream视频流的基本过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值