Как сделать минимальную прямоугольную рамку, используя контуры в scikit-изображении?

#python #scikit-image

Вопрос:

у меня есть изображение рисового зерна, моя цель-найти длину/ширину рисовых зерен и повернуть их под углом 90 градусов. До сих пор я добился того, что обнаружил рисовое зерно, найдя контуры с помощью функции measure.find_contours в scikit-изображении. Теперь у меня есть контуры, я хочу найти длину/ширину зерна, нарисовать прямоугольник вокруг зерна и повернуть его. Есть какие-нибудь идеи о том, как это сделать с помощью scikit-изображения?

Мой код таков:

 from pathlib import Path
import os, skimage
from skimage import io, color, filters, morphology, measure, draw
from matplotlib import pyplot as plt
import numpy as np

def Detect_Images():
    """Entering the directory name and join it with the current path"""
    directory = input('Enter directory: ')
    paths = os.getcwd()   '/'   directory
    image_name = []

    '''Detecting image names'''
    for path in Path(paths).rglob('*.jpg'):
        image_name.append(path.name)
    # print(image_name, paths)
    '''Reading images and converting them to Gray'''
    image_objects = []
    for file in image_name:
        image_objects.append(io.imread(str(paths)   '/'   str(file), as_gray=True))

    return image_name, image_objects


def Adaptive_Threshold(image_objects):
    """Applying adaptive thresholding"""
    thresholded_images = []
    for image in image_objects:
        blur = skimage.filters.gaussian(image)
        t = skimage.filters.threshold_otsu(blur)
        binary = blur > t
        arr = skimage.img_as_ubyte(binary)
        thresholded_images.append(arr)
    return thresholded_images


def Erosion(thresholded_images):
    """Performing erosion"""
    eroded_images = []
    kernel = np.ones((3, 3), np.uint8)
    for image in thresholded_images:
        eroded_images.append(morphology.erosion(image, kernel))
    return eroded_images


if __name__ == '__main__':

    image_name, image_objects = Detect_Images()
    thresholded_images = Adaptive_Threshold(image_objects)
    eroded_images = Erosion(thresholded_images)

    '''Finding contours'''
    contours = []
    figs = []
    for image in eroded_images:
        contours.append(measure.find_contours(image, 0.8))
        # io.imshow(image)
        ss, ax = plt.subplots()
        ax.imshow(image, cmap='gray')
        figs.append(ax)

    for i, j in zip(contours, image_name):
        print(j, ' has ', len(i), 'rice grains.')

    '''Drawing Contours'''
    for contour, fig in zip(contours, figs):
        a = fig
        for i in contour:
            a.plot(i[:, 1], i[:, 0], linewidth=2)
    plt.show()
 

И изображение такое:
Рис

Комментарии:

1. Вы ознакомились с этим учебником на веб-сайте scikit-image ?

2. Зачем бы я пришел сюда, если бы не провел свое исследование заранее ? Задал вопрос здесь после того, как я сделал свою домашнюю работу.

3. Второй фрагмент кода в этом руководстве демонстрирует, как найти ширину и длину эллиптических контуров, а затем как нарисовать прямоугольник вокруг них. На это должны быть даны ответы на 3 из 4 ваших вопросов. Если по какой-то причине код в учебнике не решает ваши проблемы, я бы предложил отредактировать ваш вопрос, чтобы показать, где он не работает.