【问题标题】:How do I make a mask from one image and then transfer it to another?如何从一张图像制作蒙版,然后将其转移到另一张图像?
【发布时间】:2019-10-18 03:02:20
【问题描述】:

我正在尝试解决一个作业问题,我需要从一个图像 (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 图像:

NPM1 图像:

我试图只获取原始图像上强度为 25 或更大的区域,以便在我试图获得直方图时,所有的黑色空间都不计入蒙版NPM1图像中细胞的强度。

【问题讨论】:

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


    【解决方案1】:

    我的解决方案仅限于使用 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 然后看起来像这样:

    而且,直方图可能如下所示:

    希望有帮助!

    附:下次,最好使用opencvpython 标签,而不是只使用cv2 标签。你会接触到更多的人。

    【讨论】:

    • 这太棒了!经过大量的谷歌搜索后,我实际上一直在使用不同的掩蔽尝试来解决这个问题。是否有任何包装或其他方法可以获得每个单独的蒙面单元的直方图而不是整个图像?我可以使用 blob_doh 分割图像,但我不确定如何获取这些单独的新坐标并应用它们
    • @Casph 我看到你已经就这个问题提出了一个新问题,并且也得到了答案。所以,我猜这里不需要进一步的帮助。 :-)
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2023-04-03
    • 1970-01-01
    • 2011-01-29
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多