染色体提取操作

从图片中提取染色体: extractChromosomes()

使用场景:

用于手工提取染色体的场景. 对于人工做过阈值化处理的图片, 利用这个函数提取出染色体.

输入:

  • 原始图像: 原始的分裂相图片. 作为提取的数据源, 提取出染色体的原始图片
  • 标定图像: 经过图像擦除, 增强处理的分裂相图片, 使得染色体的轮廓更为突出, 和背景的差别更为明显. 用于识别染色体的轮廓.

原始图像和标定图像都是单通道的灰度图像. 当前, 扫描硬件仅支持8bit图像.

我们利用标定图像来识别染色体, 然后根据轮廓从原始图像中提取染色体的图像数据, 然后再做图像增强处理. 这样, 可以避免过于二值化的标定图像导致染色体的图像细节收到损失.

处理流程:

  1. 将图像取反.
    因为我们接下来要对图像做二值化, 图像的背景是更亮的颜色, 需要取反才行.

  2. 对图像做二值化处理
    几种二值化算法, 包括大津二值化, 普通的二值化. 对于手工提取染色体的这种场景, 因为前面做了阈值调整处理, 已经将背景颜色都拉到255了. 因此使用最普通的二值化就可以.

二值化之后, 可以做一次腐蚀膨胀处理, 滤掉其中的杂质, 不过从实际看, 效果并不明显. 后来也不再使用

  1. 在二值化图像中利用cv::findContours()寻找轮廓, 并删除面积小于阈值的轮廓

  2. 基于轮廓, 调用extractChromoByContour()来生成染色体对象数据.

根据轮廓生成染色体数据 extractChromoByContour()

使用场景:

绝大部分提取染色体的场景, 都是先获取染色体轮廓(不管是自动提取, 手工勾选, 通过AI识别), 然后使用这个函数来真正构建染色体结构数据Chromosome.

输入:

  • src_img: cv::Mat, 用于提取染色体的分裂相的图片
  • contours: std::vectorcv::Point, 一个染色体的轮廓数据
  • feather_size: int, 对图像做羽化处理的尺寸. 这个参数已经废弃. 羽化操作改为ChromosomePixmapItem自己处理, 提取染色体只提供原始的未经处理的图片.

主要流程:

  1. 提取染色体图像
    我们利用掩码操作的方式, 得到染色体的黑底的图片. 在ChromosomePixmapItem自己的处理时, 会将其转化为BGRA的图片格式来显示.

  2. 将染色体旋转摆正, 并计算出着丝粒的位置
    如果是从AI服务器获取的轮廓数据, 因为已经有旋转角度了, 这一步就不需要了.

以后, 这一步也完全不再需要.