Как сделать маску из одного изображения, а затем перенести ее на другое? - PullRequest
2 голосов
/ 02 июня 2019

Я пытаюсь решить домашнюю задачу, в которой мне нужно получить маску из одного изображения (DAPI), а затем применить ее ко второму изображению (NPM1) ячеек (это те же самые ячейки в одном и том же месте)

Я бегал кругами около 4 часов, пытаясь применить маску, используя подход True / False, но, похоже, она не работает. Я попробовал и потерпел неудачу с кучей других подходов, но просто вставил тот, который, как я думал, скорее всего сработает (я супер новичок в кодировании)

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from skimage.color import rgb2gray
import cv2

#Load the images

image = np.array(Image.open("NOTREATDAPI.jpg"))
image1 = np.array(Image.open("NOTREATNPM1.jpg"))
No_Treat_DAPI = rgb2gray(image)
No_Treat_NPM1 = rgb2gray(image1)
plt.imshow(image)

#Create a mask using the DAPI image 

arr = np.array(No_Treat_DAPI)
DAPI_stain = arr[:,0] > 25

plt.imshow(arr)

Изображение DAPI:

The DAPI Image

Изображение NPM1:

The NPM1 Image

Я пытаюсь получить только те области на исходном изображении, которые имеют интенсивность 25 или более, чтобы все черное пространство в нем не учитывалось в маске, так как я пытаюсь получить гистограмму Интенсивность клеток в изображении NPM1.

1 Ответ

2 голосов
/ 05 июня 2019

Я ограничил свое решение использованием OpenCV, numpy и matplotlib.

Общий подход заключается в следующем:

  1. Загрузка обоих изображений как изображений в оттенках серого, см. cv2.imread.
  2. Создание двоичной маскииз изображения DAPI с использованием бинарного порога при значении интенсивности 25 см. cv2.threshold.
  3. Выполните морфологическое открытие, чтобы избавиться от возможных мелких артефактов, см. cv2.morphologyEx и cv2.getStructuringElement.
  4. Рассчитать гистограмму изображения NPM1, включая только маскированные пиксели, см. cv2.calcHist.

Вот полный код:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# Load images as grayscale
dapi = cv2.imread('images/NOTREATDAPI.jpg', cv2.IMREAD_GRAYSCALE)
npm1 = cv2.imread('images/NOTREATNPM1.jpg', cv2.IMREAD_GRAYSCALE)

# Create a mask using the DAPI image and binary thresholding at 25
_, mask = cv2.threshold(dapi, 25, 255, cv2.THRESH_BINARY)

# Do some morphological opening to get rid of small artifacts
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15)))

# Calculate the histogram using the NPM1 image and the obtained binary mask
hist = cv2.calcHist([npm1], [0], mask, [256], [0, 256])

# Show bar plot of calculated histogram
plt.bar(np.arange(256), np.squeeze(hist))
plt.show()

# Show mask image
cv2.imshow('Mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

Затем mask выглядит следующим образом:

Mask

И гистограммаможет выглядеть так:

Histogram

Надеюсь, это поможет!

PS В следующий раз лучше использовать opencv и pythonтеги вместо использования только тега cv2.Вы достигнете гораздо больше людей.

...