【问题标题】:MATLAB- mices segmentation in grayscale images, which is invariant to shadows灰度图像中的 MATLAB 鼠标分割,对阴影是不变的
【发布时间】:2016-06-07 09:30:44
【问题描述】:

搜索了 2 或 3 天后,我仍然没有找到解决问题的方法。

我想创建一个没有阴影的鼠标分割。问题是如果我设法去除阴影,我也会去除尾巴和脚,这是一个问题。阴影来自鼠标所在的竞技场的墙壁。

我想从灰度图像中移除阴影,但我不知道该怎么做。首先我去掉了图片的背景,得到了下面的图片。

edit1:感谢您的回答,当阴影不接触鼠标时效果很好。这就是我得到的:

来自这个原始图像:

我正在从 tif 文件中提取每一帧,并为每一帧应用您的代码。这是我使用的代码:

for k=1:1000

    %reads image
    I = imread('souris3.tif',k);

    %first stage: perform thesholding and fill holes

    seg = I >20000;
    seg = imfill(seg,'holes');

    %fixes the missing tail problem
    %extract edges, and add them to the segmentation.
    edges =  edge(I);
    seg = seg | edges;

    %fill holes (again)
    seg = imfill(seg,'holes'); 

    %find all the connected components
    CC = bwconncomp(seg,8);

    %keeps only the biggest CC
    numPixels = cellfun(@numel,CC.PixelIdxList);
    [biggest,idx] = max(numPixels);
    seg = zeros(size(edges));
    seg(CC.PixelIdxList{idx}) = 1;

    imshow(seg);

end

我使用命令impixelinfo 选择20000 作为步长,因为图像在uint16 中,它是鼠标的平均值。

如果你想拥有 tif 文件,这是链接:

souris3.tif

感谢您的帮助。

【问题讨论】:

    标签: matlab image-processing shadow image-segmentation


    【解决方案1】:

    我建议以下方法:

    1. 对图像进行阈值处理,得到一个包含老鼠大部分身体的蒙版,没有尾巴和腿。
    2. 使用 MATLAB 的 imfill 函数执行孔填充。在这个阶段,分割几乎是完美的,除了尾巴的一部分缺失。
    3. 使用边缘图来找到尾部的边界。这可以通过将边缘图添加到分割并再次执行孔填充来完成。在这个阶段只保留最大的连接组件。

    代码:

    %reads image
    I = rgb2gray(imread('mSWm4.png'));
    
    %defines thersholds (you may want to tweak these thresholds, or find
    %a way to calculate it automatically).
    FIRST_STAGE_THRESHOLD = 70;
    IM_BOUNDARY_RELEVANCE_THRESHOLD = 10;
    
    %perform thesholding and fill holes, the tail is still missing
    seg = I > FIRST_STAGE_THRESHOLD;
    seg = imfill(seg,'holes');
    
    %second stage fix the missing tail problem:
    %extract edges from relevant areas (in which the matter is not too dark), and add them to the segmentation.
    %the boundries of the image which are close enough to edges are also considered as edges
    edges =  edge(I);
    imageBoundries = ones(size(I));
    imageBoundries(2:end-1,2:end-1) = 0;
    relevantDistFromEdges = bwdist(edges) > IM_BOUNDARY_RELEVANCE_THRESHOLD;
    imageBoundries(bwdist(edges) > IM_BOUNDARY_RELEVANCE_THRESHOLD) = 0;
    seg = seg | (edges | imageBoundries);
    
    %fill holes (again) and perform noise cleaning
    seg = imfill(seg,'holes');
    seg = getBiggestCC(imopen(seg,strel('disk',1)));
    

    getBiggestCC 函数:

    function [ res ] = getBiggestCC(mask)
    CC = bwconncomp(mask,8);
    numPixels = cellfun(@numel,CC.PixelIdxList);
    [~,idx] = max(numPixels);
    res = zeros(size(mask));
    res(CC.PixelIdxList{idx}) = 1;
    end
    

    结果

    每个阶段的结果:

    结果 图片 1 结果:

    图片 2 结果:

    另一个视图(分割为红色):

    【讨论】:

    • 谢谢!当阴影不接触鼠标时效果很好。我不是只有一个图像,而是几个,有时阴影会再次出现。
    • 可以通过链接下载tif文件
    • 谢谢!如果我发现其他问题,我会尽快找你
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多