染色体提取操作
染色体提取操作
从图片中提取染色体: extractChromosomes()
使用场景:
用于手工提取染色体的场景. 对于人工做过阈值化处理的图片, 利用这个函数提取出染色体.
输入:
- 原始图像: 原始的分裂相图片. 作为提取的数据源, 提取出染色体的原始图片
- 标定图像: 经过图像擦除, 增强处理的分裂相图片, 使得染色体的轮廓更为突出, 和背景的差别更为明显. 用于识别染色体的轮廓.
原始图像和标定图像都是单通道的灰度图像. 当前, 扫描硬件仅支持8bit图像.
我们利用标定图像来识别染色体, 然后根据轮廓从原始图像中提取染色体的图像数据, 然后再做图像增强处理. 这样, 可以避免过于二值化的标定图像导致染色体的图像细节收到损失.
处理流程:
将图像取反.
因为我们接下来要对图像做二值化, 图像的背景是更亮的颜色, 需要取反才行.对图像做二值化处理
几种二值化算法, 包括大津二值化, 普通的二值化. 对于手工提取染色体的这种场景, 因为前面做了阈值调整处理, 已经将背景颜色都拉到255了. 因此使用最普通的二值化就可以.
二值化之后, 可以做一次腐蚀膨胀处理, 滤掉其中的杂质, 不过从实际看, 效果并不明显. 后来也不再使用
在二值化图像中利用
cv::findContours()
寻找轮廓, 并删除面积小于阈值的轮廓基于轮廓, 调用
extractChromoByContour()
来生成染色体对象数据.
根据轮廓生成染色体数据 extractChromoByContour()
使用场景:
绝大部分提取染色体的场景, 都是先获取染色体轮廓(不管是自动提取, 手工勾选, 通过AI识别), 然后使用这个函数来真正构建染色体结构数据Chromosome
.
输入:
- src_img: cv::Mat, 用于提取染色体的分裂相的图片
- contours: std::vectorcv::Point, 一个染色体的轮廓数据
- feather_size: int, 对图像做羽化处理的尺寸. 这个参数已经废弃. 羽化操作改为
ChromosomePixmapItem
自己处理, 提取染色体只提供原始的未经处理的图片.
主要流程:
提取染色体图像
我们利用掩码操作的方式, 得到染色体的黑底的图片. 在ChromosomePixmapItem
自己的处理时, 会将其转化为BGRA的图片格式来显示.将染色体旋转摆正, 并计算出着丝粒的位置
如果是从AI服务器获取的轮廓数据, 因为已经有旋转角度了, 这一步就不需要了.
以后, 这一步也完全不再需要.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 编程随笔!