python+opencv提取细胞特征

提取细胞特征

持续更新ing……

import os,time
import cv2
import numpy as np
import matplotlib.pyplot as plt
import copy
 
def get_fit_img(img):
    dst = cv2.fastNlMeansDenoising(img,None,15,7,21)
    return dst
 
def get_mean(temp, long_=10):
    temp_1 = []
    for m in range(0+long_, 255-long_):
        temp_1.append(temp[m-long_:m+long_].mean())
    temp_2 = np.array(temp_1)
    temp_out = np.zeros(255)
    temp_out[0+long_: 255-long_] = temp_2
    return temp_out
 
def grien_value(temp):
    temp_1 = np.zeros(255)
    temp_1[1:255] = temp[0:254]
    temp_out = temp - temp_1
    temp_out = get_mean(temp_out, 10)
    return temp_out
 
def get_last2value(temp):
    sign1 = 0
    sign2 = 0
    cnt = 0
    value = 0
    temp_4 = temp[::-1]
    for k in range(0, len(temp_4)-1):
        if temp_4[k+1] > temp_4[k]:
            sign2 = sign1
            sign1 = 1
            if sign1 != sign2:
                cnt = cnt + 1
        else:
            sign2 = sign1
            sign1 = 0
            if sign1 != sign2:
                cnt = cnt + 1
        if cnt == 3:
            value = k
            break #!!!!!!!!!
    return 255-value
 
def get_2value(img, long_ = 10):
    temp_2 = cv2.calcHist([img],[0],None,[256],[0,256])
    temp_4 = get_mean(temp_2, long_)
    temp_4 = get_mean(temp_4, 5)
    temp_4 = grien_value(temp_4) #使用二阶导数更容易检测到细胞核像素阈值
#    plt.figure("Image")
#    plt.imshow(img)
#    plt.figure("Image_value")
#    plt.plot(temp_4)
#    plt.figure("Image_value_gre")
#    plt.plot(grien_value(temp_4))
#    plt.figure("Image_value_gre2")
#    plt.plot(grien_value(grien_value(temp_4)))
#    plt.show()
    sign1 = 0
    sign2 = 0
    cnt = 0
    value_1 = 0
    value_2 = 0
    for k in range(0, len(temp_4)-1):
        if temp_4[k+1] > temp_4[k]:
            sign2 = sign1
            sign1 = 1
            if sign1 != sign2:
                cnt = cnt + 1
        else:
            sign2 = sign1
            sign1 = 0
            if sign1 != sign2:
                cnt = cnt + 1
        if cnt == 3:
            value_1 = k
            break #!!!!!!!!!
            #print(temp_4[k])
    value_2 = get_last2value(temp_4)
    return value_1,value_2
 
def get_img_open(img,fit):
    img_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel_1)
    return img_open
 
def get_img_close(img,fit):
    img_close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_1)
    return img_close

def get_cell_nuclei_mask(img, value):
    pass

def get_cell_cytoplasm_mask(img, nuclei_mask, value):
    pass

def get_cell_nuclei_value(img, img_mask): #计算深染程度
    pass

def get_cell_cytoplasm_value(img, img_mask): #细胞质计算内容暂定
    pass

if __name__ == "__main__":
    dstroot = 'cells'
    listcells = os.listdir(dstroot)
    cellsinfo = []
    for n in listcells:
        cellinfo = {}
        cellpath = os.path.join(dstroot, n)
        img = cv2.imread(cellpath)
        img_gray = cv2.imread(cellpath, 0)
        img_gray = get_fit_img(img_gray)
        value_1,value_2 = get_2value(img_gray)
        cell_nuclei_mask, nuclei_cnt, nuclei_area, nuclei_circ, nuclei_rule = get_cell_nuclei_mask(img_gray, value_1) #获取细胞核掩码、个数、面积、周长、核形规则度
        cell_cytoplasm_mask, cytoplasm_area, cytoplasm_rule = get_cell_cytoplasm_mask(img_gray, cell_nuclei_mask, value_2) #获取细胞质掩码、面积、细胞规则度
        cell_nuclei_value = get_cell_nuclei_value(img, cell_nuclei_mask) #获取细胞核深染程度
        cell_cytoplasm_value = get_cell_cytoplasm_value(img, cell_cytoplasm_mask) #获取细胞质情况
        cell_N_C = nuclei_area/cytoplasm_area #计算核质比
        cellinfo_keys = ['cellpath','nuclei_cnt','nuclei_area','nuclei_circ','nuclei_rule','cell_nuclei_value','cytoplasm_area','cytoplasm_rule','cell_cytoplasm_value','cell_N_C']
        cellinfo_values = [cellpath,nuclei_cnt,nuclei_area,nuclei_circ,nuclei_rule,cell_nuclei_value,cytoplasm_area,cytoplasm_rule,cell_cytoplasm_value,cell_N_C]
        cellinfo = dict(zip(cellinfo_keys, cellinfo_values))
        cellsinfo.append(cellinfo)

猜你喜欢

转载自www.cnblogs.com/niulang/p/12546816.html