【问题标题】:Image Segmentation and Masking图像分割和遮罩
【发布时间】:2021-07-20 03:03:51
【问题描述】:

需要帮助完成简单的任务。我正在玩LISC dataset,它包含从外周血中获取的血液学图像和这些图形样本的手动基本事实的分割掩码。任务如下:

  1. 使用数据集中给出的分割掩码,通过删除/裁剪不相关的背景元素来分割分离的白细胞。仅在一个样本上试用。
  2. 完成后,浏览整个文件夹,然后分割/裁剪其余样本。

结果应该是这样的(这些是通过 Mask R-CNN、GrabCut 和 OpenCV 的组合获得的——但不适合我正在从事的当前项目):

这是我目前得到的代码(来自 jupyter notebook):

%matplotlib inline
from sklearn.datasets import load_sample_images
from matplotlib import pyplot as plt
from matplotlib.pyplot import imread
import cv2

original = imread(r'D:\mask\1_original.bmp')
plt.imshow(original)

segmented = imread(r'D:\mask\1_mask.bmp', cv2.IMREAD_GRAYSCALE)
_, mask = cv2.threshold(segmented, thresh=180, maxval=255, type=cv2.THRESH_BINARY)

plt.imshow(segmented)

我不知道为什么图像会改变颜色,因为原始蒙版看起来像这样(只有黑色和灰色):

这是我用于最终结果的代码,但是一旦应用了蒙版,颜色就会失真并且与原始颜色不同,这就是我现在尝试修复的问题,但无济于事:

%matplotlib inline

import matplotlib.pyplot as plt
from matplotlib.pyplot import imread
import cv2

img_org = cv2.imread(r'D:\mask\1_original.bmp')
img_mask = cv2.imread(r'D:\mask\1_mask.bmp')

##Resizing images
img_org = cv2.resize(img_org, (400,400),  interpolation = cv2.INTER_AREA)
img_mask = cv2.resize(img_mask, (400,400), interpolation = cv2.INTER_AREA)

for h in range(len(img_mask)):
    for w in range(len(img_mask)):
        if img_mask[h][w][0] == 0:
            for i in range(3):
                img_org[h][w][i] = 0
        else:
            continue
                      
plt.imshow(img_org)

提前致谢!

【问题讨论】:

  • 您的问题是什么?不清楚,所以修改你的问题标题和文字以强调这一点。
  • 如果我理解正确,你真正的问题是“为什么图像显示为黄色和深蓝色而不是黑色和灰色或黑色和白色?这与 matplotlib 使用的颜色图有关,它默认情况下是“viridis”(从蓝色到绿色到黄色)。听起来你想要“二进制”。在此处查看颜色图的完整列表:matplotlib.org/stable/tutorials/colors/colormaps.html 在任何情况下,将颜色图指定为:plt.imshow(segmented, cmap=plt.get_cmap("binary"))
  • 嘿@DerekG,感谢您的介入!是的,指定颜色图有效,我已经用黄色解决了这个问题。谢谢。
  • @DerekG,这里的主要障碍是最终图像的颜色(帖子中的最后一个),basophil颜色与应用后的原始图像(帖子顶部)不同面具。您能否检查最后的代码 sn-p 并提出任何可以解决此问题的调整?
  • 酷酷,我在下面的答案中添加了信息。如果这为您提供了所需的信息,我建议您接受答案并关闭问题,因为我怀疑此问题中的信息在 SE 的其他地方重复出现。谢谢!

标签: python image-segmentation masking


【解决方案1】:

颜色的变化是上述 cmets 中指定的热图(viridis 而不是二进制)的结果。

输出图像与输入图像具有不同的颜色,因为 OpenCV 使用 BGR 而不是 RGB 颜色,因此很可能您的红色和蓝色通道被交换了。如果您使用 OpenCV 读取图像并使用 Matplotlib 绘图,反之亦然。有两种简单的解决方案:

1.) 使用 OpenCV 读取和绘制图像。您可以将plt.imshow(im_orig) 替换为:

cv2.imshow("window name", im_orig)
cv2.waitKey(0) # waits until a key is pressed before continuing
cv2.destroyAllWindows()

2.) 在用plt.imshow() 绘图之前交换 R 和 B 通道:

im_orig = cv2.cvtColor(im_orig, cv2.COLOR_BGR2RGB)
plt.imshow(im_orig)

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 2022-10-23
    • 2018-05-29
    • 2016-06-09
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多