图像分割和掩蔽

Image Segmentation and Masking

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

  1. 使用数据集中给定的分割掩码,通过 removing/cropping 不相关的背景元素分割孤立的白细胞。仅在一个样本上尝试此方法。
  2. 完成后,浏览整个文件夹,segment/crop 其余示例。

结果应该是这样的(这些是通过 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_original.bmp')
plt.imshow(original)

segmented = imread(r'D:\mask_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_original.bmp')
img_mask = cv2.imread(r'D:\mask_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)

提前致谢!

颜色的变化是指定热图(绿色而不是二进制)的结果,如上面评论中所述。

输出图像与输入图像具有不同的颜色,因为 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.) 在绘图之前交换 R 和 B 通道 plt.imshow():

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