Как очертить область изображения с известными координатами? - PullRequest
1 голос
/ 07 марта 2020

У меня ультразвуковое изображение и координаты (массив точек x и y) опухоли каждого изображения. Как я могу сделать контур вокруг опухоли с этими известными координатами, используя "cv.drawContours ()"? Я sh удаляю всю информацию о опухоли и остаюсь только с изображением / информацией опухоли.

Ultrasound image with the tumour ROI

temp=np.array([[284.,  60.],[276.,  59.],[269.,  58.],[260.,  58.],[247.,  60.],[241.,  65.],[237.,  68.],[233.,  72.],[228.,  80.],[225.,  87.],[225.,  96.],[229., 107.],[233., 109.],[238., 110.],[244., 111.],[253., 112.],[260., 113.],[267., 115.],[273., 116.],[290., 115.],[298., 113.],[306., 110.],[313., 109.],[323., 108.],[330., 102.],[330., 100.],[335.,  96.],[338.,  94.],[344.,  91.],[346.,  86.],[346.,  82.],[346.,  77.],[346.,  73.],[341.,  70.],[337.,  68.],[327.,  64.],[322.,  63.],[314.,  62.],[305.,  62.],[300.,  61.],[293.,  60.],[289.,  60.],[284.,  60.]])

imagem = cv2.imread('thyroid/2_1.jpg', cv2.IMREAD_GRAYSCALE)

cc=cv2.drawContours(imagem,temp,3,(0,255,0),3)

Я получаю эта ошибка: error Traceback (most recent call last) <ipython-input-25-59da73cb5b29> in <module> 2 imagem = cv2.imread('thyroid/2_1.jpg', cv2.IMREAD_GRAYSCALE) 3 ----> 4 cc=cv2.drawContours(imagem,temp,3,(0,255,0),3) error: OpenCV(3.4.1) C:\Miniconda3\conda-bld\opencv-suite_1533128839831\work\modules\imgproc\src\drawing.cpp:2515: error: (-215) npoints > 0 in function cv::drawContours Как я могу исправить эту ошибку? Потому что мои контуры - это список

img = cv2.imread('thyroid/2_1.jpg', cv2.IMREAD_GRAYSCALE) temp=temp.astype(np.int32) cc=cv2.drawContours(img,[temp.astype('i4')],-1,(0,255,0),3)

1 Ответ

0 голосов
/ 07 марта 2020

2 проблемы в приведенном выше коде:

1: Как я уже упоминал в своем комментарии, для рисования контуров требуется список контуров, поэтому оберните temp в скобки, чтобы сделать его списком:

cc=cv2.drawContours(imagem,[temp],-1,(0,255,0),3)

2: кажется, что контуры рисования недовольны 64-разрядными числами с плавающей запятой (по умолчанию для numpy). Получение 32-битного int, похоже, работает для меня, как предложено здесь .

cc=cv2.drawContours(imagem,[temp.astype('i4')],-1,(0,255,0),3)

Весь рабочий код на моем P C:

import cv2
import numpy as np

temp=np.array([[284.,  60.], [276.,  59.], [269.,  58.], [260.,  58.], [247.,  60.], [241.,  65.], [237.,  68.], [233.,  72.], [228.,  80.], [225.,  87.], [225.,  96.], [229., 107.], [233., 109.], [238., 110.], [244., 111.], [253., 112.], [260., 113.], [267., 115.], [273., 116.], [290., 115.], [298., 113.], [306., 110.], [313., 109.], [323., 108.], [330., 102.], [330., 100.], [335.,  96.], [338.,  94.], [344.,  91.], [346.,  86.], [346.,  82.], [346.,  77.], [346.,  73.], [341.,  70.], [337.,  68.], [327.,  64.], [322.,  63.], [314.,  62.], [305.,  62.], [300.,  61.], [293.,  60.], [289.,  60.]])

imagem = cv2.imread(r'c:\Users\username\Desktop\image.png', cv2.IMREAD_GRAYSCALE)

cc=cv2.drawContours(imagem,[temp.astype('i4')],-1,(255,0,0),3)
cv2.imshow('image',cc)
cv2.waitKey(0)
...