【问题标题】:Matlab: Removing white cells from imageMatlab:从图像中去除白细胞
【发布时间】:2015-06-22 07:28:44
【问题描述】:

我只想去除下图中的白细胞并保留红细胞。在 Matlab 中执行此操作的最佳方法是什么?

format longg;
format compact;
fontSize = 16;
rgbImage = imread('E:\GP_Final\DS\CL_13-09_image2.jpg');
[rows columns numberOfColorBands] = size(rgbImage);
% imshow(rgbImage, []);

% title('Original Color Image', 'FontSize', fontSize);
hsv = rgb2hsv(rgbImage);
% figure(2),imshow(hsv);
% Display the color channels.
hueImage = hsv(:, :, 1);
saturationImage = hsv(:, :, 2);
valueImage = hsv(:, :, 3);
subplot(2, 2, 2);
imshow(hueImage, []);
title('Hue Channel', 'FontSize', fontSize);
subplot(2, 2, 3);
imshow(saturationImage, []); 
title('Saturation Channel', 'FontSize', fontSize);
subplot(2, 2, 4);
imshow(valueImage, [])
title('Value Channel', 'FontSize', fontSize);
[pixelCounts values] = hist(hueImage, 500);
 figure;
 bar(values, pixelCounts);
title('Histogram of Hue Channel', 'FontSize', fontSize);
redPixels = hueImage > 0.3 & hueImage >0.8 & valueImage <= 0.9;
% figure(10);
% imshow(redPixels);
% title('Map of red Pixels', 'FontSize', fontSize);
saturationImage(redPixels) = saturationImage(redPixels) *3.5;
% figure(7),imshow(saturationImage);
% title('New Saturation Channel', 'FontSize', fontSize);

% Combine back to form new hsv image
hsvImage = cat(3, hueImage, saturationImage, valueImage);
% Convert back to RGB color space.
rgbImage = hsv2rgb(hsvImage);
figure(8), imshow(rgbImage);
title('RGB Image with Enhanced red', 'FontSize', fontSize);

se1 = strel('disk',1);
 erodedBW = imerode(redPixels,se1);
se2 = strel('disk',2);
 dilatedBW2 = imdilate(erodedBW,se2);
se3 = strel('disk',1);
 openedBW = imopen(dilatedBW2,se3);

 filledBW=imfill(openedBW,'holes');
 figure(3), imshow(filledBW);title('after fill holes  ');


bw3=bwareaopen(filledBW,80);
    figure(5), imshow(bw3);title('after remove small objects ');

这是我做的,但它不适用于所有图像,有什么方法可以解决它?

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    您希望删除图像中间的深紫色单元格。查看HSV colour space 中的颜色分布是一项非常简单的任务。在这种情况下,我不会查看色调,因为图像的颜色分布很可能具有相似的色调。饱和度是我的目标。

    让我们从 StackOverflow 中读取图像,将图像转换为 HSV 并查看饱和度分量:

    im = imread('http://i.stack.imgur.com/OQUKj.jpg');
    hsv = rgb2hsv(im2double(im));
    imshow(hsv(:,:,2))
    

    我们得到这张图片:

    您可以清楚地看到“红色”血细胞的饱和度高于背景,因此我们可以进行一些简单的阈值化。 0.4 的饱和度似乎对我有用:

    mask = hsv(:,:,2) > 0.4;
    imshow(mask);
    

    我们得到这个:

    存在一些虚假像素,因此我们可以通过 bwareaopen 操作将其删除。任何面积低于 300 的像素我都会删除:

    mask_remove = bwareaopen(mask, 300);
    imshow(mask_remove);
    

    我们得到这个:

    现在,剩下的牢房里有洞。我们可以通过使用imfill 填充这些漏洞并选择holes 选项来解决这个问题:

    mask_fill = imfill(mask_remove, 'holes');
    imshow(mask_fill);
    

    我们得到这个:

    我将稍微扩大这个面具,以确保我们摆脱其余的紫色环境:

    se = strel('square', 7);
    mask_final = imdilate(mask_fill, se);
    

    最后要做的是使用这个遮罩并遮盖原始图像,然后生成去除白细胞的最终图像。只需反转蒙版并将其与原始图像相乘,然后用白色填充缺失的信息:

    mask_final = repmat(mask_final, [1 1 3]);
    out = im .* uint8(~mask_final);
    out(mask_final) = 255;
    imshow(out);
    

    我们得到这个:

    【讨论】:

    • 对不起,但是白细胞不是背景,它是图像中间的奇怪颜色,我在此链接中标记了不同的颜色fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpt1/v/t1.0-9/…
    • 感谢您的回答,它仅在此图像中运行良好,但抱歉我有一些图像,我想输入任何图像并仅提取红细胞进入另一个处理阶段作为计数。他们的图像。我想要任何血液图像的代码。 imgur.com/a/deJra
    • 如果您想继续此操作并针对此类图像进行调整,您可以聘请我作为 Codementor。考虑到您没有尝试任何事情并且没有付出任何努力,这足以让您入门。如果您不想雇用我,我将把这项任务留给您自己解决。这足以让您开始。祝你好运!
    • 好的,我已经尝试过这样做,但它仍然不适用于所有图像 rgbImage = imread('image2.jpg'); [行列 numberOfColorBands] = size(rgbImage); hsv = rgb2hsv(rgbImage);hueImage = hsv(:, :, 1);饱和度图像 = hsv(:, :, 2); valueImage = hsv(:, :, 3); [pixelCounts 值] = hist(hueImage, 500);数字;条(值,像素计数); title('色调通道直方图'); redPixels = hueImage > 0.3 & hueImage >0.8 & valueImage
    • 用您的代码更新您的帖子。在超过几行的 cmets 块中读取代码非常难看。
    【解决方案2】:

    您可以通过将图像拖入工作区或单击 Matlab 中的“导入”按钮来导入图像。这将为您提供一个宽 x 高 x 3 矩阵,其中包含每个像素的 RGB 值。通过对红色、绿色和蓝色值进行阈值处理,您可以选择要编辑的像素。使用imview()imsave(),您可以查看和存储结果。

    要编辑多个图像,您可以使用(将 png 替换为您拥有的扩展名):

    fileNames = [cellstr('name1'), cellstr('name2')]; % The images to process without extension.
    for i = 1:length(fileNames)
      img = imread([char(fileNames(i)), '.png']);
      % Process the image here.
      % ...
      imwrite([char(fileNames(i)), '-edited.png'], 'png');
    end
    

    【讨论】:

    • 我有多个图像,我不想手动输入图像,输出将进入另一个处理步骤和计数,您能帮帮我吗?
    • 我添加了允许您自动加载和保存多个图像的代码。
    • 我不想保存它们,我只想提取红细胞并计数
    猜你喜欢
    • 2014-06-24
    • 2019-06-03
    • 2013-08-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多