图像分割和遮罩

时间:2021-04-26 18:10:26

标签: python image-segmentation masking

需要协助完成简单的任务。我正在使用 LISC dataset,其中包含从外周血中获取的血液学图像和这些图形样本的手动地面实况分割掩码。任务如下:

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

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

Original Image Mask & Segmented Image

这是我目前得到的代码(来自 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)

enter image description here

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)

enter image description here

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

enter image description here

这是我用于最终结果的代码,但是一旦应用蒙版,颜色就会扭曲并且与原始代码不同,这就是我现在试图修复但无济于事的原因:

%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)

enter image description here

提前致谢!

1 个答案:

答案 0 :(得分:1)

颜色的变化是上面注释中提到的指定热图(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)