Скопируйте фигуру на пустой холст (OpenCV, Python)

import numpy as np
import cv2

blank_image = np.zeros((40,40,3), np.uint8)
blank_image.fill(255)

#cv2.imshow('i', blank_image)
#cv2.waitKey(0)

im = cv2.imread('img.png')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[4]
cnts = cv2.drawContours(im,[cnt],0,(255,0,0), -1)

cv2.imshow('i', im)
cv2.waitKey(0)

for a in cnt:
    print(a) #this contour is a 3D numpy array

Исходное изображение:

ЦСИ

Я использую этот код для: 1. создания белого холста размером 40x40 пикселей 2. нашел контуры числа (в данном случае 5) с помощью функции Opencv findContours,

out1

Я хочу скопировать эту форму (пожалуйста, не ограничивающую рамку или прямоугольник, синюю форму) на холст.

После некоторых исследований я узнал, что изображение opencv - это просто массив. Этот массив теоретически должен быть переведен в новое изображение (мой белый холст..), а затем реконструировать форму, используя значения внутри массива. Я не ошибаюсь?

Кто-то знает, как это сделать? Создание ограничивающего прямоугольника / прямоугольника вокруг чисел в некоторых случаях приведет к неточностям. Пожалуйста, не принимайте это как решение. Я уже сделал этот процесс по крайней мере 3-4 различными способами, и результаты не являются достаточно удовлетворительными.

Итак, желаемый результат будет примерно таким...

out2

Благодарю.

1 ответ

Решение

Для контуров изображения

Я думаю, хочу что-то вроде


Для открытого номера, такого как 1, 2, 5 Это легко сделать: обрезать изображение целиком или нарисовать новое изображение. Для закрытого номера, такого как 0, 6, 8, 9, нужно больше шагов. Вот пример для 5, ты получишь ,


Подробности и описание в коде.

#!/usr/bin/python3
# 2018.01.14 09:48:15 CST
# 2018.01.14 11:39:03 CST

import numpy as np
import cv2

im = cv2.imread('test.png')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


## this contour is a 3D numpy array
cnt = contours[4]
res = cv2.drawContours(im,[cnt],0,(255,0,0), -1)
cv2.imwrite("contours.png", res)

## Method 1: crop the region
x,y,w,h = cv2.boundingRect(cnt)
croped = res[y:y+h, x:x+w]
cv2.imwrite("croped.png", croped)

## Method 2: draw on blank
# get the 0-indexed coords
offset = cnt.min(axis=0)
cnt = cnt - cnt.min(axis=0)
max_xy = cnt.max(axis=0) + 1
w,h = max_xy[0][0], max_xy[0][1]
# draw on blank
canvas = np.ones((h,w,3), np.uint8)*255
cv2.drawContours(canvas, [cnt], -1, (255,0,0), -1)
cv2.imwrite("canvas.png", canvas)
Другие вопросы по тегам