前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料)
一、题目
根据附件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与当前其他主流视觉函数库的性能比较。