首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确计算图像中每个单元的相邻单元数?

如何正确计算图像中每个单元的相邻单元数?
EN

Stack Overflow用户
提问于 2020-04-09 16:32:47
回答 1查看 162关注 0票数 0

我想计算一个二进制图像中六边形单元的百分比(例如,具有6个相邻单元的单元数量/总单元数量),并生成如下所示的彩色编码图像。

我已经尝试了下面的python代码,但是我没有得到正确的输出。例如,如您所见,二进制图像中的红色单元格有4、5、6或7个相邻单元格,但计算错误,因为它们有3、4和6个相邻单元格。

附上了一个二进制图像及其输出的示例。

代码语言:javascript
运行
AI代码解释
复制
import sys
import json
import cv2
import os
import scipy.io
import numpy as np
from scipy.ndimage import measurements, morphology
from skimage import measure
import time


def cells_measurements(path, orig_image, color="yellow", size=3, 
    pixel_sz=0.00104167):
    size = int(size)
    im = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
    _, im = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)
    labeled_image, num_of_cells = measurements.label(255 - im)
    props = measure.regionprops(labeled_image)
     number_of_cells = len(props)

  colored_image = np.pad(cv2.cvtColor(~im, cv2.COLOR_GRAY2BGR), ((1, 1),(1, 1), (0, 0,)), mode='constant',constant_values=0)

  colors = [[0, 0, 128], [0, 0, 255], [0, 128, 255], [0, 255, 255],[128,255, 128], [255, 255, 0], [255, 128, 0],[255, 0, 0]]

   count_hex = 0
   labels = np.unique(labeled_image)
   for l in labels[1:]:
       i_temp = (labeled_image == l).astype(float) * 255
       i_temp = cv2.dilate(i_temp, np.ones((3, 3)), iterations=2) - i_temp
       i_temp2 = np.copy(labeled_image)
       i_temp2[i_temp == 0.] = 0
       adjacent = len(np.unique(i_temp2)) - 1
       if adjacent == 6:
          count_hex += 1
     cv2.floodFill(colored_image, None, (int(cell_center_all[l - 1][1]), 
     int(cell_center_all[l - 1][0])), colors[min(adjacent, 7)])

       hexagonal_cells = (count_hex / num_of_cells) * 100

     colored_image = np.pad(colored_image, ((0, 0), (0, 75), (0, 0)), 
    'constant', constant_values=255)
       for i in range(8):
           step = colored_image.shape[0] // 8
           colored_image[i * step:+(i + 1) * step, -60:-35] = colors[7 - i]
           colored_image[i * step, -60:-35] = 0
           colored_image[(i + 1) * step, -60:-35] = 0
           colored_image[i * step:(i + 1) * step, -60] = 0
           colored_image[i * step:(i + 1) * step, -35] = 0
           cv2.putText(colored_image, str(7 - i), (colored_image.shape[1] - 
           30, 5 + i * step + step // 2), cv2.FONT_HERSHEY_DUPLEX, 0.5, 0)

   color_path = 'Labeled Images/' + fn + "_color.png"
   cv2.imwrite(color_path, colored_image)

  Auto_Cells_Pleomorphism = []

  Mask_Path = 'generated_samples_masks/'
  Original_img_path = 'TestingSet/enhanced_imgs/'
  # please note that the "mask" image is the result of the segmentation 
  algorithm which I will provide today

  # Loop over images
  for i in range(1, 640):
      filename = str(i) + '.png'
      print(filename)
      Masks_Path = os.path.join(Mask_Path, filename)
      Original_image = os.path.join(Original_img_path, filename)
      [hexagonal_cells] = cells_measurements(Masks_Path, Original_image, 
      color="yellow", size=3) 

  Auto_Cells_Pleomorphism.append(round(hexagonal_cells))

正如你所看到的,二进制图像有一些模糊的边缘。我如何提高他们的可见性?

EN

回答 1

Stack Overflow用户

发布于 2020-04-09 17:53:02

一种方法是使用分水岭算法进行分割。

点击此处阅读相关信息:

https://scikit-image.org/docs/dev/auto_examples/segmentation/plot_watershed.html

https://www.pyimagesearch.com/2015/11/02/watershed-opencv/

你可以看看有没有更好的many other segmentation algorithms (例如Felsenszwalb's algorithm)。Here是三种算法的简单比较,您可以很容易地扩展此示例,以查看它们在数据集上的比较情况。

一旦你有了所有元素(多边形)的轮廓,你就可以使用它们来创建一个“完整的地图”(识别所有单元和它们的邻居,没有洞,没有未知的元素),以确保你没有遗漏任何单元。您可以将其称为单元的拓扑。

有一件事可能会有帮助,那就是从分水岭算法返回的多边形中创建“更清晰”的多边形。

你可能不得不

  • 合并结点如果它们非常接近
  • 连接边如果其连接处的角度约为0°

这就是所谓的“修复,修复,简化网格”。它本身就是一个主题,当然也有工具可以做到这一点。您可以阅读与Python相关的项目hereherehere

一旦完成,你只需计算边缘,创建一个所有相邻单元的列表,并交叉检查所有相邻单元是否被检测到。

这个算法不是开箱即用的,你必须改进和调整它,直到它起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61125888

复制
相关文章
你知道如何安全正确的关闭线程池吗?
我们知道应用停机时需要释放资源,关闭连接,而对于一些定时任务或者网络请求服务会使用线程池,当应用停机时我们需要正确安全的关闭线程池,如果处理不当,可能造成数据丢失,业务请求结果不正确等问题。
纯洁的微笑
2019/10/18
5.6K0
你知道如何安全正确的关闭线程池吗?
有人知道如何提取matlab符号表达式系数吗?
调用方法:[C,T] = coeffs(___),C为返回的系数,T为对应多项式项
巴山学长
2019/12/27
4.8K0
21 - JavaScript 中少有人知道的技巧
原文链接:https://dev.to/bhagatparwinder/lesser-known-javascript-tricks-kjj
前端黑板报
2022/12/01
2220
你知道在iOS开发的工作中为什么有人4k有人40k吗?
  如果你有志于将iOS开发作为职业,或者已经是一位iOS开发者,那么你应该听说过唐巧的名字。唐巧,2012年从网易有道离开参与创业, 目前是猿题库iOS高级研发工程师。难得的是,他本身是一线的iOS开发者,同时又对iOS开发在国内的布道做了不少的工作,身影活跃于博客、微博、微信公众账号等地。从2011年以来,唐巧开始在博客分享自己写的iOS开发技术文章,CocoaChina 也曾多次转载过他的博客文章,后来他成为InfoQ兼职编辑,除了发表技术文章之外,还负责整理《iOS移动开发周报》,至今已有35期,他的微博和微信公众账号粉丝都超过1万,可以说是iOS开发领域的“大V”。并且他的新书《iOS开发进阶》已经和大家见面,也引得他的粉丝的一份热潮
Kris大鲨
2018/05/11
2.8K3
你知道在iOS开发的工作中为什么有人4k有人40k吗?
你知道Spring中BeanFactoryPostProcessors是如何执行的吗?
了解了BeanDefinition以及生命周期的大概概念之后,我们可以试着看一下源码!我们上一章也说到,BeanFactoryPostProcessors的执行时机是:在扫描完成之后,实例化之前!那么我们看一下Spring是如何去回调BeanFactoryPostProcessors的呢?
止术
2020/09/15
9650
你知道Spring中BeanFactoryPostProcessors是如何执行的吗?
如何关闭笔记本小键盘_笔记本电脑怎么关键盘灯光
您使用下面两个方法,都可以用来关闭触摸板:(1)请您“双击”触摸板左上角位置的小圆点,当指示灯为橙色时,表示触摸板关闭。(2)或者,请您点击开始—控制面板—鼠标—装置设…
全栈程序员站长
2022/11/05
2.5K0
如何关闭笔记本小键盘_笔记本电脑怎么关键盘灯光
如何使用NoNotifications关闭Ubuntu通知提示
在 Ubuntu 中连接个手机,连通有线或无线网络、有新系统更新时都会在桌面右侧弹出通知提示,这个功能本可以帮助用户实时了解系统和硬件工作状态的动态变化,但当你需要长时间专注工作时,这些可能会随机弹出的通知提示经常都会打断我们的工作和思路。如果你使用了 KDE Connect,各种消息更可能让你抓狂。
用户8710806
2021/06/09
2.1K0
你知道在springboot中如何使用WebSocket吗
  我们都知道 http 协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息。想要实现浏览器的主动推送有两种主流实现方式:
用户2038589
2019/05/24
2.9K0
你知道关闭页面时怎么向后台发送消息吗?
这两天碰到一个需求:在用户刷新页面或者关闭页面的时候,前端要给后台发一条请求,释放该页面的授权占用。
编程三昧
2021/08/16
1K0
你知道关闭页面时怎么向后台发送消息吗?
开源组件清单 有人知道这个可以去哪里获取清单吗?
前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个ChatGPT数据提取的问题,一起来看看吧。
Python进阶者
2023/11/13
2150
开源组件清单  有人知道这个可以去哪里获取清单吗?
ubuntu关闭时间同步
虽然System clock synchronized: no,但是时间仍然在同步。因为还要重启一下服务。这一步特别重要。
超级大猪
2019/11/22
6.1K0
MyEclipse中如何隐藏关闭的项目?
问题描述:   我们有很多已经关闭的项目,不想让它显示,该如何办呢?如下图所示: 操作步骤: 效果如下:
黑泽君
2018/10/11
1.4K0
MyEclipse中如何隐藏关闭的项目?
小米笔记本怎么关闭secure boot
2、进入电源选项设置后,点击”更改当前不可用的设置”,再把”启用快速启动(推荐)”前边的勾去掉 (若没有该选择则不需要操作,直接略过进行第二步)。
周小董
2019/03/25
3K0
你知道 Java 中的隐藏类吗?
前几天给大家介绍了Java 17中新推出的密封类,今天继续给大家介绍一个Java 15开始推出的一个新内容:隐藏类。 如果你喜欢做封装、做框架的话,这个内容可能对你很有用哦! 什么是隐藏类 隐藏类,是一种不能被其他类直接使用的类。引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们。 可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它! 如果你关注Java前沿知识,记得关注公众号:程序猿DD,持续分享前沿技术内容,积累普通技术人的弯道超车资本! 隐藏类案例 第一步:
程序猿DD
2022/05/09
7200
你知道Hive中的中位数吗
关于求解中位数,我们知道在Python中直接有中位数处理函数(mean),比如在Python中求解一个中位数,代码很简单。
数据社
2020/05/25
2K0
笔记本Ubuntu系统 开启Wifi
而目前的UBUNTU系统装机自带的无线网卡驱动大部分都是适用于博通公司(boardcom)
JNingWei
2018/09/28
2K0
联想计算机的功能键,联想fn键怎么用 联想fn组合按键功能介绍【图文】「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 Fn键是每个笔记本上都拥有的按键,熟悉电脑的朋友都知道,笔记本为了考虑到超薄便携的特性,因此显示器上并没有像台式机那样的控制按钮,因此使用按钮调节笔记本显示器
全栈程序员站长
2022/07/29
3.2K0
Ubuntu笔记本黑屏不休眠
但是发现一旦笔记本电脑黑屏之后代理就失效了,而且ssh链接不上,然后一查发现ubuntu黑屏会直接休眠。
小N同学
2022/05/12
1.2K0
Ubuntu笔记本黑屏不休眠
加速ubuntu开机速度
http://forum.ubuntu.org.cn/viewtopic.php?t=7505 原作者i3dmaster 译者yang119345 加速Ubuntu开机过程 此HowTo 适合抱
全栈程序员站长
2021/05/19
1.6K0
关闭Ubuntu提示欢迎语
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Fri Sep 23 09:31:54 CST 2016 System load: 0.3 Processes: 254 Usage of /: 2.3% of 114.
苦咖啡
2018/04/28
2.3K0

相似问题

有人知道DimScreen (亮度)用于ubuntu吗?

10

有人知道Ubuntu12.04中的OpenGL应用吗?

10

有人知道Ubuntu中的笔记和笔记本的替代品或本地应用程序吗?

20

有人知道如何改变火狐图标吗?

30

有人知道如何直播从树莓pi B+到ubuntu的高清视频吗?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档