如何从一幅图像制作遮罩,然后将其转移到另一幅图像?

时间:2019-06-02 05:27:32

标签: python opencv image-processing mask scikit-image

我正在尝试解决一个家庭作业问题,我需要从一个图像(DAPI)获取遮罩,然后将其应用于单元格的第二个图像(NPM1)(它们在完全相同的位置是相同的单元格)

我已经绕圈跑了大约4个小时,试图使用“真/假”方法来应用蒙版,但是它似乎不起作用。我尝试了很多其他方法,但均以失败告终,但只是粘贴了我认为最有可能的方法(我对编码来说是新手)

%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 个答案:

答案 0 :(得分:2)

我将解决方案限于使用OpenCV,numpy和matplotlib。

一般方法如下:

  1. 将两个图像都加载为灰度图像,请参见cv2.imread
  2. 在强度值25处使用二进制阈值从DAPI图像创建二进制掩码,请参见cv2.threshold
  3. 进行一些形态上的处理以消除可能的小瑕疵,请参见cv2.morphologyExcv2.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

希望有帮助!

P.S。下次,最好使用opencvpython标签,而不是仅使用cv2标签。您会吸引更多人。