Как я могу масштабировать толщину символа в изображении, используя Python OpenCV? - PullRequest
0 голосов
/ 02 июля 2018

Я создал одно задание, в котором у меня есть белый фон и черные цифры.

Мне нужно взять наибольшую по толщине цифру. Я сделал свою картинку, узнал все символы, но не понимаю, как масштабировать толщину. Я пробовал arcLength (контуры), но он дал мне самый большой по размеру. Я пробовал морфологические операции, но, как я понял, это помогает убрать шумы и другие ошибки на картинке, верно? И у меня была мысль проверить расстояние между соседними точками контуров, но потом я подумал, что это будет сложно из-за не точной и четкой формы символов (я рисую тнем на краске). Итак, это все идеи, которые у меня были. Можете ли вы помочь мне в этом вопросе, рассказав названия тем в Comp. Vision и OpenCV, что может помочь мне решить эту задачу? Мне не нужен точный алгоритм решения, только темы. И если это не задача OpenCV, то что же? Какая библиотека? Должен ли я изучить какой-то пакет тем и основ до решения моей задачи?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Задумывались ли вы о том, чтобы нарисовать линию из определенной точки контура и искать точки, где линия пересекает ваш контур? Я имею в виду, если вы получите координаты из двух точек, вы можете измерить расстояние. Я сделал образец, чтобы продемонстрировать, что я имею в виду. Обратите внимание, что этот скрипт предназначен только для демонстрации решения и не будет работать с другими картинками, кроме моей. Я бы сказал лучше, но я столкнулся с программированием всего несколько месяцев назад.

enter image description here

Итак, первое, что нужно сделать, это выделить контуры, которые, как вы сказали, вы уже сделали (учтите, что cv2.findContours находит значения белого). тогда вы можете получить ссылочные координаты с помощью cv2.boundingRect() - она ​​возвращает координаты x, y, ширину и высоту ограничивающего прямоугольника для вашего контура (вы, конечно, можете сделать что-то подобное, извлекая небольшой излом вашего контура на маску и работая с там). В моем примере я определил центр поля и немного переместил линию, затем сделал линию влево (я сделал это, добавив списки и преобразовав их в массивы, и, вероятно, есть миллион лучших решений). Затем вы ищете точки, которые находятся в вашем контуре и в вашей линии (эти точки являются точками пересечения). Я рассчитал просто по разности двух координат х, потому что это работает для этой демонстрации, но лучший подход будет sqrt(x2-x1)^2+(y2-y1)^2. Может быть, это даст вам идею. Ура!

Пример кода:

import cv2
import numpy as np
import numpy

img = cv2.imread('Thickness2.png')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray_image,10,255,cv2.THRESH_BINARY_INV)
im2, cnts, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
font = cv2.FONT_HERSHEY_TRIPLEX

for c in cnts:
    two_points = []
    coord_x = []
    coord_y = []
    area = cv2.contourArea(c)
    perimeter = cv2.arcLength(c, False)
    if area > 1 and perimeter > 1:
        x,y,w,h = cv2.boundingRect(c)
        cx = int((x+(w/2))) -5
        cy = int((y+(h/2))) +15
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
        for a in range(cx, cx+70):
            coord_x.append(a)
            coord_y.append(cy)
        coord = list(zip(coord_x, coord_y))
        arrayxy = np.array(coord)
        arraycnt = np.array(c)
        for a in arraycnt:
            for b in arrayxy:
                if a[:,0] == b[0] and a[:,1] == b[1]:
                    cv2.circle(img,(b[0],b[1]), 2, (0,255,255), -1)
                    two_points.append(b)
        pointsarray = np.array(two_points)
        thickness = int(pointsarray[1,0]) - int(pointsarray[0,0])
        print(thickness)              
        cv2.line(img, (cx, cy), (cx+50, cy), (0,0,255), 1)
        cv2.putText(img, 'Thickness : '+str(thickness),(x-20, y-10), font, 0.4,(0,0,0),1,cv2.LINE_AA)

cv2.imshow('img', img)

Выход:

enter image description here

0 голосов
/ 02 июля 2018

Одним из возможных решений, которое я могу придумать, является чередование эрозии и поиск контуров, пока у вас не останется только один контур (который должен быть более толстым). Это может сработать, если разницы в толщине достаточно, но я также могу предвидеть много частных случаев, которые могут помешать правильной идентификации, поэтому очень сильно зависит от того, как ваше исходное изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...