Python 如何正确计算图像中每个单元格的相邻单元格数?
请,我想计算二值图像中六边形单元的百分比(例如,有6个相邻单元的单元数/单元总数),并生成如下所示的彩色编码图像 我尝试了下面的python代码,但没有得到正确的输出。例如,如您所见,二值图像中的红细胞有4、5、6或7个相邻细胞,但计算错误,因为它们有3、4和6个相邻细胞 附上一个二值图像及其输出的示例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
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°,则连接边缘
您必须改进和调整它,直到它工作。您的代码有一个不匹配的
“
字符(语法高亮显示出错的地方),his将不会运行。这与您运行的代码完全相同吗?请复制您实际遇到问题的粘贴代码!你所说的“二值图像有一些模糊的边缘”是什么意思?二值图像只有两个不同的值,不能有任何模糊。你在那里显示的图像不是二进制的。亲爱的Cris Luengo谢谢你的帮助,事实上这是我正在运行的同一个代码。我是说模糊的边缘。回答得好。另外,看看《Skimage》中的Felzenszwalb和Huttenlocher我不是从一种新的分割方法来看的,我需要修复上面的代码,使其在二值图像上工作。我是python新手,我不确定代码是否将此图像作为二进制图像读取。图像中模糊的边缘可能可以通过形态学操作得到改善。看看扩张或闭合。在操作之间,您可能需要使用阈值来加强边界,然后重复。