#python #opencv #image-processing
#python #opencv #обработка изображений
Вопрос:
Моя цель состоит в том, чтобы взять изображение, выделить кривые / контуры, которые имеют пороговое значение в оттенках серого ниже локального числа (скажем, 3), а затем обвести их прямоугольниками, одновременно записывая это обратно на исходное изображение — как способ обнаружения трещин на изображении в оттенках серого. Ниже то, что я придумал, просмотрев онлайн-руководства.
# import the necessary packages
import numpy as np
import cv2
# Load an color image in grayscale
img = cv2.imread('chest-ct-lungs.jpg',0)
ret,thresh = cv2.threshold(img,3,255,cv2.THRESH_BINARY_INV)
# Detect the contours in the image
image, contours =
cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
# Draw all the contours
all_contour_img = cv2.drawContours(image, contours, -1, (0,255,0), 3)
cv2.imwrite('all_contour_img.png',all_contour_img)
# Use bounding rectangles
x,y,w,h = cv2.boundingRect(contours)
cv2.rectangle(all_contour_img,(x,y),(x w,y h),(0,255,0),2)
# Draw over original image
imwrite(uint8(double(img) all_contour_img), 'output.png');
Однако я получаю это в качестве выходных данных при запуске с использованием python IDLE:
Traceback (most recent call last):
File "C:UserscomDesktoppython.py", line 17, in <module>
all_contour_img = cv2.drawContours(image, contours, -1, (0,255,0), 3)
TypeError: Expected cv::UMat for argument 'image'
Любые указания на то, где я ошибаюсь, а также рекомендации по написанию приведенного выше кода — я новичок.
Я хочу, чтобы это произошло :
Комментарии:
1.
image, contours = cv2.findContours(....)
— прочитайте документацию (специфичную для используемой вами версии OpenCV — я думаю, либо 2.4, либо 4.x), вы неправильно назвали / неверно истолковали результирующие значения. Первый не является изображением, а второй — не контурами. В результате вы пытаетесь использовать список контуров, как если бы это было изображение, и рисовать на нем … это, очевидно, не сработает.
Ответ №1:
В зависимости от используемой вами версии OpenCV, cv2.findContours() вернет список контуров и некоторые другие данные. Все, что вам нужно, это список контуров. Вы можете просто игнорировать другие материалы и очистить свой код, присвоив эти неиспользуемые переменные _
.
cv2.findContours
возвращает СПИСОК контуров. Это похоже на список фигур. Если вы хотите нарисовать bounding rectangle
вокруг каждой фигуры, вам нужно выполнить итерацию по списку контуров.
# Import the necessary packages
import numpy as np
import cv2
# Load an color image in grayscale, threshold
img = cv2.imread('/home/stephen/Desktop/test.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,3,255,cv2.THRESH_BINARY_INV)
# Detect the contours in the image
_, contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
# Draw all the contours
img = cv2.drawContours(img, contours, -1, (0,255,0), 1)
# Iterate through all the contours
for contour in contours:
# Find bounding rectangles
x,y,w,h = cv2.boundingRect(contour)
# Draw the rectangle
cv2.rectangle(img,(x,y),(x w,y h),(255,255,0),1)
# Write the image
cv2.imwrite('/home/stephen/Desktop/lines.png', img);