細胞核を検出して、最近傍細胞までの距離、番号、 座標を出力するPythonプログラム(OpenCV)

細胞核を検出して、最近傍細胞までの距離、番号、 座標を出力するPythonプログラム(OpenCV)

山椒魚
山椒魚 (ID3679) 2020/03/08
0

面白そうなので

http://www.kenkyuu2.net/cgi-biotech2012/biotechforum.cgi?mode=view;Code=8684

組織画像上の細胞間距離を網羅的に計測したいという人がいたので。

作った。

対象画像

処理の流れ(コードを読んでね)

import cv2
import numpy as np


a = cv2.imread("MALE127.jpg",cv2.IMREAD_GRAYSCALE)
print(a.shape)
ori = a

a = cv2.blur( a, (4,4))


a = 255 - a

cv2.imwrite("gray.png",a)
height = a.shape[0]
width = a.shape[1]


w_height = 5
w_width = 5

#normalizationm
a = a/a.max()

threshold = 0.5

cord = []

for y in range( w_height//2, height-w_height//2):
    
    for x in range(w_width//2, width-w_width//2):
        if a[y,x] > threshold:
            flag = 0
            
            #Nonmaximum suppression
            for j in range(w_height):
                for i in range(w_width):
                    
                    if a[y + j - w_height //2, x + i - w_width //2 ] > a[y,x]:
                        flag = flag +1
                        
            
            #小フレーム内で中心点が最大だった場合→ピーク検出された場合格納
            else:
                if flag == 0:
                    cord.append(np.array([x,y]))
        

cord = np.array(cord)
print(cord.shape)
b = a



print(cord[0,0])

for xy in cord:
    #print(xy)
    b = cv2. circle(b, (xy[0],xy[1]), 1, color=(0,0,255), thickness = 1 )
    
ratio = 0.6
#cv2.imwrite("result.png",(ori*ratio+b*(1-ratio))/2)
#白いところだけ加算するほうが良いかも知れない
cv2.imwrite("result.png", ori + b)
#各ピーク座標に対する最近接ピーク座標と距離
import sys

min = 1000
cord_len = len(cord)

for at in cord:
    tmp_min = []
    for i in range(cord_len):
        x_range = at[0]-cord[i,0]
        y_range = at[1]-cord[i,1]
        
        tmp_len = np.sqrt(x_range * x_range + y_range * y_range)
        
        if tmp_len > 1:
            tmp_min.append(tmp_len)
    
    #1点に対する距離計算格納後
    else: 
        #print(len(tmp_min))
        #print(tmp_min)
        #sys.exit()
        tmp_min = np.array(tmp_min)
        tmp_min_idx = np.argmin(tmp_min)
        #最小値
        print(tmp_min.min(), tmp_min_idx, cord[tmp_min_idx])

結果

精度? 知りません

参考にしてくれた記事

記事が登録されていません。
この記事を参考にして、新しく記事を投稿しよう!

違反について