Как я могу извлечь только среднюю кость на этом изображении, используя только эрозию, расширение, xor и пороговую обработку?

Я использую opencv, чтобы извлечь среднюю большую кость из этого изображения, и не могу понять, как это сделать

Как видите, видны все три кости, но мне нужна только средняя кость. Вот код

b =  cv.imread('content/B.tif', cv.IMREAD_GRAYSCALE)

plt.figure(figsize=(5,5))
plt.imshow(b, cmap='gray')
plt.axis('off')
plt.show()

_, binary_b = cv.threshold(b, 200, 255, cv.THRESH_BINARY)
b_e = cv.erode(binary_b, np.ones((1,1), dtype=np.uint8))
b_d = cv.dilate(b_e, np.ones((5,5), dtype=np.uint8),iterations = 3)

xor = cv.bitwise_and(b_d,b)

plt.figure(figsize=(5,5))
plt.imshow(xor, cmap='gray')
plt.axis('off')
plt.show()

Может кто-нибудь помочь, пожалуйста?

Это самая большая кость... поэтому cv2.findContours, за которым следует max(contours, key = cv2.contourArea), помогает. Попробуйте и напишите ответ сами, если не получится, посмотрю повнимательнее

Tino D 12.04.2024 09:08

Откуда взялось ограничение «использовать только эрозию, расширение, xor и пороговую обработку»? Как вы думаете, это реалистичное ограничение?

Cris Luengo 12.04.2024 15:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался найти центральную кость, как самую большую, используя контур. Пожалуйста, смотрите код ниже с объяснением в комментариях. Надеюсь это поможет.

import cv2
import numpy as np

#Read image and convert to gray scale
image = cv2.imread("bone.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresholded_image = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)

#Dilate image to close gaps
#Erode image to remove additional edges created using dilation
#number of iteration found by trial and error
kernel = np.ones((5,5),np.uint8)
thresholded_image = cv2.dilate(thresholded_image, kernel,iterations=5)
thresholded_image = cv2.erode(thresholded_image, kernel,iterations=5)

#get the contour of dilate eroded image
contours, hierarchy = cv2.findContours(thresholded_image, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

#Since center bone is largest
#Find contour with max length
max_length=0
max_length_ctr=None
for ctr in contours:
    x,y,w,h = cv2.boundingRect(ctr)
    if h > max_length:
        max_length = h
        max_length_ctr = ctr

#Use the found contour to create mask and get the bone
if max_length_ctr is not None:
    big_bone_mask = np.zeros_like(thresholded_image)
    cv2.drawContours(big_bone_mask, [max_length_ctr], -1, (255, 255, 255), -1)
    cv2.imwrite("big_bone_mask.png",big_bone_mask)

    # Get the graph from original image from the mask
    bone_image = cv2.bitwise_and(image, image, mask=big_bone_mask)
    cv2.imwrite("bone_image.png", bone_image)

Выход

@RachitAnand Почему вы приняли этот ответ, когда в вопросе говорилось «использование только эрозии, расширения, XOR и пороговой обработки», а извлечение контура, очевидно, не является ничем из этого?

Cris Luengo 12.04.2024 15:05

@CrisLuengo Это была моя вина, я совершенно забыл, что контуры существуют

Rachit Anand 13.04.2024 16:09

Другие вопросы по теме