一、题目
根据附件cell.jipg,使用opencv库或者PIL库计算细胞核与细胞质的面积比。
二、题目分析
这道题目识别细胞的时候,要分别识别细胞核和细胞膜。对此进行操作的时候,首先需要将图像转化成灰度图像。接着需要将灰度图像二值化,通过threshold方法传入灰度图像和阙值,我们根据细胞核和细胞膜的颜色得到核的阙值为131,细胞质的阙值为220,然后第三个参数传入最大阙值255,第四个参数为THRESH_BINARY,表示二进制化阙值。
然后根据内核的大小,抛弃掉边界附近的像素。kernel =np.ones((2,2),np.uint8),在这里我们使用2*2的内核,它包含了所有的1。之后通过开运算传入图像,内核等进行计算。接着通过canny函数进行边界检测,查找出轮廓然后提取边框。通过findContours传入检测到的边缘。最后通过两个列表储存边框面积,获取最大面积对应的索引框,通过计算得出的细胞核和细胞质的大小相除就得到了核质比
三、代码
import cv2 import numpy as np img = cv2.imread("cell.jpg") # 转为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow("gary", gray) # 二值化 thresh1, Cellmask = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY) thresh2, Coremask = cv2.threshold(gray, 131, 255, cv2.THRESH_BINARY) # 开运算 kernel = np.ones((2, 2), np.uint8) Cellmask = cv2.morphologyEx(Cellmask, cv2.MORPH_OPEN, kernel) Coremask = cv2.morphologyEx(Coremask, cv2.MORPH_OPEN, kernel) # 边缘检测 cannyCell = cv2.Canny(Cellmask, 40, 200) cannyCore = cv2.Canny(Coremask, 40, 200) # 边框提取 Cell, Celldata = cv2.findContours(cannyCell, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) Core, Coredata = cv2.findContours(cannyCore, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) # 存储边框面积 CellS = [] CoreS = [] for i in range(len(Cell)): CellS.append(cv2.contourArea(Cell[i])) for i in range(len(Core)): CoreS.append(cv2.contourArea(Core[i])) # 获取最大面积对应边框索引 Maxcell = CellS.index(max(CellS)) Maxcore = CoreS.index(max(CoreS)) cv2.drawContours(img, Cell, Maxcell, (0, 255, 0), 1) cv2.drawContours(img, Core, Maxcore, (0, 0, 255), 1) cv2.imshow("Cellmask", cannyCell) cv2.imshow("Coremask", cannyCore) cv2.imshow("img", img) print("核质面积比为:{:.3f}".format(max(CoreS) / (max(CellS)-max(CoreS)))) cv2.waitKey()
四、实验结果
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
为什么有OpenCV?
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:
1、研究代码(慢,不稳定,独立并与其他库不兼容)
2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。图1为OpenCV与当前其他主流视觉函数库的性能比较。