Я хотел бы извлечь контуры изображения, выраженные в виде последовательности координат точек.
С помощью Canny
я могу создать бинарное изображение, содержащее только края изображения. Затем я пытаюсь использовать findContours
для извлечения контуров. Однако результаты не в порядке.
Для каждого края я часто получал 2 линии, как если бы он считался очень тонким участком. Я хотел бы упростить свои контуры, чтобы я мог рисовать их как отдельные линии. Или, может быть, извлечь их с помощью другой функции, которая напрямую выдает правильный результат, было бы еще лучше.
Я просмотрел документацию OpenCV, но не смог найти ничего полезного, но я думаю, что я не первый с подобной проблемой. Есть ли какая-либо функция или метод, который я мог бы использовать?
Вот код Python, который я написал до сих пор:
def main():
img = cv2.imread("lena-mono.png", 0)
if img is None:
raise Exception("Error while loading the image")
canny_img = cv2.Canny(img, 80, 150)
contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
scale = 10
contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)
for cnt in contours:
color = np.random.randint(0, 255, (3)).tolist()
cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)
cv2.imwrite("canny.png", canny_img)
cv2.imwrite("contours.png", contours_img)
Масштабный коэффициент используется для выделения двойных линий контуров. Вот ссылки на изображения:
- Лена оттенки серого
- Ребра, извлеченные с помощью
Canny
- Контуры: 10-кратное увеличение, где вы можете видеть неправильно результаты, созданные
findContours
Любое предложение будет принята с благодарностью.