Изображение неправильно маркируется: как вернуть только один подключенный компонент?

Я хочу предварительно обработать изображение

сырое изображение

чтобы оставался только внутренний прямоугольный сегмент (т.е. удалялся окружающий фон). Но я не получаю правильный результат, который был показан как

обрезанное изображение.

для меня.

Код довольно прост:

def labelim(img):
    #labeling image
    gray = rgb2gray(img) #translate rgb to gray
    val = filters.threshold_local(gray,5)
    mask = gray > val
    clean_border = segmentation.clear_border(mask)
    labeled = label(clean_border)
    signle_labeled = np.where(labeled == 0,labeled, 1)#ensure all assigned label return as 1.
    return single_labeled
def crop_img(img, labeled):    
    cropped_images = []
    pad = 20
    for region in regionprops(labeled):
        if region.area < 2000:
            continue
        minr,minc,maxr,maxc = region.bbox
        cropped_images.append(gray[minr-pad:maxr+pad, minc-pad:maxc+pad])
    for c, cropped_image in enumerate(cropped_images):
        cropim = cropped_image
    return cropim

labeled = labelim(img)
cropped_image = crop_img(img, labeled)

Код тестирования работает для другого моего изображения, но не работает для большинства из них. Спасибо за любую помощь/предложение.


person Orangeblue    schedule 06.09.2018    source источник
comment
Я удалил лишнюю часть. Спасибо, что дали мне знать!   -  person Orangeblue    schedule 06.09.2018
comment
кажется, вы начинаете с 0,0, поэтому либо minc/minr равны нулю (или меньше, чем pad).   -  person Martin Beckett    schedule 06.09.2018
comment
пс. ваш цикл обрезки в конце не имеет смысла   -  person Martin Beckett    schedule 06.09.2018
comment
Можете ли вы уточнить? Я распечатал [minr,minc] как [119L, 128L]. И это сработало для другого похожего изображения.   -  person Orangeblue    schedule 06.09.2018
comment
Очень похоже, что вы только что взяли прямоугольник 0,0->200,200 из исходного изображения, что имело бы смысл, если бы minr/c был неправильным.   -  person Martin Beckett    schedule 06.09.2018
comment
cropim перезаписывается внутри цикла. Таким образом, вы возвращаете только последний из обрезанных регионов.   -  person Cris Luengo    schedule 06.09.2018
comment
Я знаю, что в данном конкретном случае был помечен только один компонент, так что здесь это не влияет на результат.   -  person Orangeblue    schedule 06.09.2018


Ответы (1)


Задача решена:

одна маленькая ошибка здесь:

cropped_images.append(gray[minr-pad:maxr+pad, minc-pad:maxc+pad])

должно быть:

cropped_images.append(img[minr-pad:maxr+pad, minc-pad:maxc+pad])
person Orangeblue    schedule 06.09.2018