【问题标题】:Segmentation for open-contour line drawings开放轮廓线图的分割
【发布时间】:2021-06-19 08:23:55
【问题描述】:

Here 是我所说的绘图类型的一个示例:

它有明显不同的区域,但它们不是完全封闭的。

我正在尝试对图像进行分割,但由于它是 1 位颜色,因此我没有任何有用的信息,例如色调或值渐变,无法做出更有根据的猜测。乍一看,分割算法可以用来做出决定的唯一信息似乎是低于或高于某个阈值的间隙宽度。

我的问题是,在 scikit-image 或 opencv 中是否有特定的方法或算法适用于这种输入或至少类似的输入。

【问题讨论】:

    标签: python image-processing computer-vision image-segmentation


    【解决方案1】:

    您可以使用negative affinities 和相关聚类将您的图像分割成如下内容:

    您可以为附近的像素对定义“亲和性”:如果它们之间存在“边缘”像素 - 那么它们应该具有负亲和性(它们不应聚集在一起)。
    如果它们之间没有任何边缘像素 - 那么它们应该具有正亲和力(它们应该聚集在一起)。

    一旦你有了亲和力矩阵,你就可以对它应用correlation clustering

    这是 Matlab 中解决方案的草图:

    img = imread('PaG3p.png');
    bw = img(:,:,1) > 128;
    n = numel(bw);
    
    % construct the affinity matrix using improfile
    [x, y] = meshgrid(1:size(bw,2), 1:size(bw,1));
    x = x(:);
    y = y(:);
    
    r = 5;
    [dx, dy] = meshgrid(-r:r, -r:r);
    dx = dx(:);
    dy = dy(:);
    sel = max(abs(dx),abs(dy)) == r & dx >= dy;
    dx = dx(sel);
    dy = dy(sel);
    m = numel(dx);
    
    ii = nan(n*m, 1);
    jj = nan(n*m, 1);
    wij = zeros(n*m, 1);
    counter = 1;
    for k=1:n    
        % from
        fi = y(k);
        fj = x(k);
        if bw(fi, fj)
            % to
            for l=1:m
                ti = fi + dy(l);
                tj = fj + dx(l);
                if ti > 1 && tj > 1 && ti <= size(bw,1) && tj <= size(bw,2) && bw(ti, tj)
                    p = improfile(bw, [fj, tj], [fi, ti]);
                    num_cross = sum((p(2:end)-p(1:end-1)) == -1);
                    
                    ii(counter) = k;
                    jj(counter) = sub2ind(size(bw), ti, tj);
    
                    if  num_cross == 1
                        % only one cross of edge
                        wij(counter) = -1;
                    elseif num_cross == 0
                        % no crosses
                        wij(counter) = 1;
                    end
                    counter = counter + 1;
                end
            end
        end
        % add 4 connect
        if fi < size(bw,1) && bw(fi+1, fj)
            ii(counter) = k;
            jj(counter) = sub2ind(size(bw), fi + 1, fj);
            wij(counter) = (bw(fi, fj) == bw(fi+1, fj))*2 - 1;
            counter = counter + 1;
        end
        if fj < size(bw,2) && bw(fi, fj+1)
            ii(counter) = k;
            jj(counter) = sub2ind(size(bw), fi, fj + 1);
            wij(counter) = (bw(fi, fj) == bw(fi, fj+1))*2 - 1;
            counter = counter + 1;
        end    
    end
    
    sel = ~isnan(ii);
    ii=ii(sel);
    jj=jj(sel);
    wij=wij(sel);
    W = sparse(ii, jj, wij, n, n);
    W = W + W.';  % make symetric
    
    % apply correlation clustering
    l = a_expand(W, bw(:));
    out = reshape(l, size(bw));
    

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 2017-05-15
      • 2021-08-03
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2021-11-12
      • 2021-03-08
      相关资源
      最近更新 更多