Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确计算图像中每个单元格的相邻单元格数?_Python_Python 3.x_Image_Image Processing_Image Segmentation - Fatal编程技术网

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

Python 如何正确计算图像中每个单元格的相邻单元格数?,python,python-3.x,image,image-processing,image-segmentation,Python,Python 3.x,Image,Image Processing,Image Segmentation,请,我想计算二值图像中六边形单元的百分比(例如,有6个相邻单元的单元数/单元总数),并生成如下所示的彩色编码图像 我尝试了下面的python代码,但没有得到正确的输出。例如,如您所见,二值图像中的红细胞有4、5、6或7个相邻细胞,但计算错误,因为它们有3、4和6个相邻细胞 附上一个二值图像及其输出的示例 import sys import json import cv2 import os import scipy.io import numpy as np from scipy.ndimage

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

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

附上一个二值图像及其输出的示例

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))

正如你所看到的,二值图像有一些模糊的边缘。如何提高他们的可视性


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

请在此处阅读:

有一些你可以看的 看看是否有更好的方法(例如)。这是三种算法的简单比较,您可以轻松地扩展此示例,以查看它们在数据集上的比较情况

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

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

你可能不得不

  • 如果节点非常接近,则合并节点
  • 如果边缘连接处的角度约为0°,则连接边缘
这被称为“固定、修复、简化网格”。 这本身就是一个话题,当然也有相应的工具。 您可以阅读与Python相关的项目 , 或

完成后,您只需计算边缘,创建所有相邻单元的列表,并交叉检查是否检测到所有相邻单元

这个算法不是现成的,
您必须改进和调整它,直到它工作。

您的代码有一个不匹配的
字符(语法高亮显示出错的地方),his将不会运行。这与您运行的代码完全相同吗?请复制您实际遇到问题的粘贴代码!你所说的“二值图像有一些模糊的边缘”是什么意思?二值图像只有两个不同的值,不能有任何模糊。你在那里显示的图像不是二进制的。亲爱的Cris Luengo谢谢你的帮助,事实上这是我正在运行的同一个代码。我是说模糊的边缘。回答得好。另外,看看《Skimage》中的Felzenszwalb和Huttenlocher我不是从一种新的分割方法来看的,我需要修复上面的代码,使其在二值图像上工作。我是python新手,我不确定代码是否将此图像作为二进制图像读取。图像中模糊的边缘可能可以通过形态学操作得到改善。看看扩张或闭合。在操作之间,您可能需要使用阈值来加强边界,然后重复。