0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV4中联通组件分析的一个缺点

OpenCV学堂 来源:OpenCV学堂 2024-01-04 15:51 次阅读

数据集

最近别人给了我一个生物数据分割的标注数据集,让我训练一下,发现这个数据集比较诡异,图像格式是tif的16位的浮点数,OpenCV读取过来要显示得先转换,然后它的Mask是PNG的带透明通道,最坑人的是Mask标记都是1、只有相互连接的对象标记才相互不同。官方给出的原始图像解析以后是这样:

0c28d444-aad6-11ee-8b88-92fbcf53809c.png

OpenCV读取显示图像样本

OpenCV读取tif格式16位的图像在于imread的第二个参数,默认情况下会转换为BGR彩色八位字节的图像,如果这样就是一片漆黑;这里选择为-1表示不改变原图像的通道数据信息,这样就可以读取原始图像数据了,然后转换为32f的,再归一化到0~1之间,直接显示即可。代码如下:

importnumpyasnp
img=cv.imread("D:/11111.tif",-1)#uint16
img_16=img.astype(np.float32)
cv.normalize(img_16,img_16,0,1,cv.NORM_MINMAX)
img_16.astype(np.float32)
result=np.uint8(img_16*255)
cv.imwrite('D:/tensor_cv2.jpg',result)

0c32a4a6-aad6-11ee-8b88-92fbcf53809c.jpg

OpenCV读取显示Mask图像

Mask图像是带透明通道的RGBA的图像,但是实际上所有的标注信息只存在于red通道中,所以读取以后,直接拆分通道,然后把red通道数据作为灰度图像处理,因为灰度值太低了,显示的时候我给扩大了点倍数,直接把灰度图像扔到联通组件扫描的函数中,然后就可以看到结果了。相关代码如下:

importnumpyasnp
img=cv.imread("D:/11111.png")#uint16
bb,gg,rr=cv.split(img)
h,w,c=img.shape
print(img.shape,img.dtype)
numOfcons,labels=cv.connectedComponents(rr)

colors=[]
foriinrange(numOfcons):
b=np.random.randint(0,256)
g=np.random.randint(0,256)
r=np.random.randint(0,256)
colors.append((b,g,r))

colors[0]=(0,0,0)
image=np.zeros((h,w,3),dtype=np.uint8)
forrowinrange(h):
forcolinrange(w):
image[row,col]=colors[labels[row,col]]

cv.imshow("coloredlabels",image)
cv.imwrite("D:/opencv_labels.png",image)
cv.imshow("bgr",rr*100)
cv.waitKey(0)
cv.destroyAllWindows()

标记的Mask信息原图

0c3b9584-aad6-11ee-8b88-92fbcf53809c.jpg

基于联通组件查找以后的彩色显示(注意白色粘连)

0c49233e-aad6-11ee-8b88-92fbcf53809c.png

对比与解决

对比之后发现,OpenCV中联通组件扫描以后把不同标签的样本粘连在一起了,这个是因为OpenCV寻找联通组件只分为两种值0为背景,非0就作为前景,不做灰度级别区分的联通域识别,所以导致了粘连。这个时候,只要用skimage库的函数来替换OpenCV的联通组件扫描就可以避免粘连了,因为skimage库的联通组件扫描支持独立标签分级。代码演示如下:

importskimage.io
importskimage.morphology

#Loadoneimageafteruncompressingmasks.zip
gt=skimage.io.imread("D:/11111.png")

#Keepfirstchannelonly
gt=gt[:,:,0]

#Labelindependentconnectedcomponents
gt=skimage.morphology.label(gt)
colors=[]
foriinrange(150):
b=np.random.randint(0,256)
g=np.random.randint(0,256)
r=np.random.randint(0,256)
colors.append((b,g,r))
colors[0]=(0,0,0)
h,w=gt.shape
image=np.zeros((h,w,3),dtype=np.uint8)
forrowinrange(h):
forcolinrange(w):
image[row,col]=colors[gt[row,col]]

#Displayimageoruseasneeded
cv.imshow("coloredlabels",image)
cv.imwrite("D:/labels.png",image)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果对比 - 可以发现白色区域没有粘连,成功分割!

0c4f4af2-aad6-11ee-8b88-92fbcf53809c.png

希望OpenCV迟早有一天可以支持这种分级的区域联通组件扫描算法







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    27

    文章

    1289

    浏览量

    56733
  • OpenCV
    +关注

    关注

    31

    文章

    635

    浏览量

    41343

原文标题:新知 | OpenCV4中联通组件分析的一个缺点

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenCV4.8 CUDA编程代码教程

    OpenCV4支持通过GPU实现CUDA加速执行,实现对OpenCV图像处理程序的加速运行,当前支持加速的模块包括如下。
    的头像 发表于 12-05 09:56 1026次阅读
    <b class='flag-5'>OpenCV</b>4.8 CUDA编程代码教程

    OpenCV自带组件HighGUI怎么使用?

    将介绍OpenCV自带组件HighGUI的简单使用。当我们在测试算法,查看算法效果的时候,需要用到可视化,动态调参的界面,也可能需要监听鼠标,键盘等的动作,这时,HighGUI就发挥大作用了,HighGUI作为
    发表于 11-05 06:54

    鲁班猫0 -安装opencv

    ON要等那么会儿,结事之后就可以make了:sudo make -j4这里就是漫长的等待,我这里大约两小时结束结束后执行sudo make install配置#opencv4.pc
    发表于 04-09 13:29

    Yuzuki Lizard 全志V851S开发板 –编译 OPENCV 4.5.4

    ,设定) 到此编译成功 6、编译出来的文件 动态库文件 /usr/local/lib/ 文件库 /usr/local/include/opencv4/ 注意下面步骤成功编译出来的固件,是不含动态库
    发表于 05-08 09:22

    CMake在Linux 6.1.1-1.0.0搜索包opencv损坏了吗?

    我有 cmake 项目,使用以下 CMake 语句从 Yocto Linux SDK 导入 OpenCV 库: find_package (需要OpenCV ) 在
    发表于 05-09 11:32

    中联通公开招募3G电子渠道合作企业

    中联通公开招募3G电子渠道合作企业      12月11日消息,中国联通12月10日发布公告,开始面向社会公开招募社会电子渠
    发表于 12-11 09:42 554次阅读

    基于opencv4和Yolo-Fastest,实现PC和单片机通信,控制步进电机捕获目标

    效果视频 基于opencv4和yolo,实现PC和单片机通信,控制步进电机捕获目标
    发表于 11-23 17:36 16次下载
    基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,实现PC和单片机通信,控制步进电机捕获目标

    分享两OpenCV图像处理与分析的问题

    仔细观察图,可以看到两最直接的是靶心有十字交叉线,而在OpenCV形态学处理,支持十字交叉结构元素,所以我们可以先检测两条线,然后获取十字交叉结构,最后对结构进行轮廓
    的头像 发表于 08-22 09:40 942次阅读

    如何在Raspberry Pi 3上安装OpenCV4

    今天我们将学习如何在 Raspberry Pi 3 上安装 OpenCV4 库,以便我们可以将其用于计算机视觉应用程序。这将允许 OpenCV 在像 Pi 这样的便携式设备上运行,从而打开许多可能性的大门。所以让我们开始吧
    的头像 发表于 09-08 16:09 1598次阅读
    如何在Raspberry Pi 3上安装<b class='flag-5'>OpenCV4</b>库

    OpenCV4SIFT算法概述

    SIFT特征是非常稳定的图像特征,在图像搜索、特征匹配、图像分类检测等方面应用十分广泛,但是它的缺点也是非常明显,就是计算量比较大,很难实时,所以对些实时要求比较高的常见SIFT算法还是无法适用。
    的头像 发表于 11-23 09:48 1502次阅读

    OpenCV4源码分析

    宏定义必须写在函数之外,其作用域是 #define 开始,到源程序结束。如果要提前结束它的作用域则用 #undef 命令
    的头像 发表于 02-22 10:00 997次阅读
    <b class='flag-5'>OpenCV4</b>源码<b class='flag-5'>分析</b>

    学习OpenCV4的系统化路线图

    OpenCV4发布测试版本开始,作者就直关注!根据自己近十年图像处理OpenCV开发相关工作经验,花了七月的时间,针对OpenCV4
    的头像 发表于 07-05 11:30 633次阅读
    学习<b class='flag-5'>OpenCV4</b>的系统化路线图

    OpenCV4笔记之连通域分析

    连通:若 S 是图像像素子集,对于任意的 。如果存在条由 S 像素组成的从 p 到 q 的通路,则称 p 在像素集 S
    的头像 发表于 12-25 17:16 977次阅读
    <b class='flag-5'>OpenCV4</b>笔记之连通域<b class='flag-5'>分析</b>

    OpenCV4图像分析之BLOB特征分析

    BLOB是图像灰度块的种专业称呼,更加变通点的可以说它跟我们前面二值图像分析联通组件类似
    的头像 发表于 12-28 12:28 1360次阅读
    <b class='flag-5'>OpenCV4</b>图像<b class='flag-5'>分析</b>之BLOB特征<b class='flag-5'>分析</b>

    opencv-python和opencv样吗

    样。OpenCV(Open Source Computer Vision Library)是开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。
    的头像 发表于 07-16 10:38 1175次阅读