#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 ваших вопросов. Если по какой-то причине код в учебнике не решает ваши проблемы, я бы предложил отредактировать ваш вопрос, чтобы показать, где он не работает.