Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Find the center of mass of cells and crop the image

I am trying to make a program to analyze cell nucleus, but in order to do so, I need to isolate each nucleus and crop the image in a way that each nucleus will be centered (its center of mass will be in the middle).

The image looks like this:

image description

So far I have created the following code, which puts the squares around the biggest contours found in the image. But that's not really what I wanted...

import cv2
import numpy as np
import tiffcapture as tc

class SelectNucleus(it.ImageTools):
tiff = None
img = None

def __init__(self, path):
    """Load image etc."""
    self.tiff = tc.opentiff(path)
    self.img =[1]
    self.img = np.array(self.img, dtype=np.uint8)

def split_nucleus(self):
    """split image and into few parts, one neclues in each"""
    _, thresh = cv2.threshold(self.img, 100, 255, 0)
    kernel = np.ones((2, 2), np.uint8)
    thresh = cv2.erode(thresh, kernel, iterations=1)
    kernel = np.ones((10, 10), np.uint8)
    thresh = cv2.dilate(thresh, kernel, iterations=1)

    cv2.imshow('a', self.img)
    self.img, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    big_contour = []
    max = 0
    for i in contours:
        area = cv2.contourArea(i)  # --- find the contour having biggest area ---
        if (area > 5000):
            max = area

    self.img = cv2.cvtColor(self.img, cv2.COLOR_GRAY2RGB)

    # draw rectangles around contours
    for contour in big_contour:
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(self.img, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.drawContours(self.img, big_contour, -1, (255, 0, 0), 3)

    cv2.imshow('i', self.img)

a = sn.SelectNucleus('1-4.tif')

The output looks like this:

image description

Do you have any ideas on how to do it?