Нахождение ограничивающих рамок разных символов / букв - PullRequest
0 голосов
/ 19 апреля 2020

Я изучаю ограничивающие рамки OpenCV, и до сих пор это было хорошо для меня. Однако у меня возникают проблемы с поиском ограничивающих букв более сложных букв / символов.

Я просмотрел документацию, но не смог найти ничего, касающегося того, как найти ограничивающие рамки сложных символов / букв (например, %,! или буква j или i)

Я приложил свое входное изображение. Input Image

Код, который я использую для обработки ограничивающих рамок.

import cv2
import numpy as np

img=cv2.imread('test.jpg')
imgCont=img.copy()
imgFinal=img.copy()


imggray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgcanny=cv2.Canny(imggray,200,240)
contours,_ = cv2.findContours(imgcanny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

rect_d=[] #store the dimensions of my bounding boxes
min_cont_area=10
for cnt in contours:
    #print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt)>min_cont_area: #Limit the contours based on area?  
        box_d=cv2.boundingRect(cnt)
        x,y,w,h=box_d
        rect_d.append([x,y,w,h]) 
        cv2.rectangle(imgCont, (x,y),(x+w,y+h), (0, 0, 255),1)

i=0
roi_n=[] #store each bounding box for later
for d in range(0,len(rect_d)):    
    x=rect_d[i][0] #Find x 
    y=rect_d[i][1] #Find y 
    w=rect_d[i][2] #Find width 
    h=rect_d[i][3] #Find height 
    roi=imgFinal[y:y+h,x:x+w]
    roi_n.append(roi)
    cv2.imwrite('Boxed_ROIs_'+str(i) + '.jpg', roi) 
    i+=1

cv2.imshow('Final Result',imgCont)
cv2.imwrite('Final Result.jpg',imgCont)

cv2.waitKey(0)
cv2.destroyAllWindows()

Вывод, полученный из моего кода. My output

Если кто-нибудь может помочь мне понять, как go о:

1) Найти неправильные ограничивающие полигоны (не прямоугольники), например, с помощью "квадрата" 1041 * из 3 "имеют неправильный ограничивающий многоугольник для" квадрата root "и ограничивающий прямоугольник для" 3 "

2) Можно ли объединить ограничивающие прямоугольники по горизонтали / вертикали / по диагонали. Например, было бы полезно, если бы я знал, как объединить ограничивающие прямоугольники для знака "=" или объединить ограничивающие прямоугольники для "%".

3) Можно ли разделить ограничивающие прямоугольники на несколько ограничивающих ящики?

Мой желаемый результат будет выглядеть примерно так. enter image description here

********************** ОБНОВЛЕНИЕ ************ ********************************

Мне удалось обновить на основе ваших предложений, однако я не знаю, как получить квадратный root символ,! и = символ на его собственных ограничивающих прямоугольниках.

import cv2
import numpy as np

img=cv2.imread('test.jpg')
imgCont=img.copy()
imgFinal=img.copy()

imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,imgThresh = cv2.threshold(imgGray,249,250,cv2.THRESH_BINARY_INV)

kernel_erosion = np.ones((1,1),np.uint8)
imgErode = cv2.erode(imgThresh,kernel_erosion,iterations = 2)

kernel_open = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(1,2))
imgOpen = cv2.morphologyEx(imgErode, cv2.MORPH_OPEN, kernel_open)

kernel_dilate = np.ones((2,2),np.uint8)
imgDilate = cv2.dilate(imgOpen,kernel_dilate,iterations = 4)

contours,_ = cv2.findContours(imgDilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

rect_d=[] #store the dimensions of my bounding boxes
min_cont_area=5
for cnt in contours:
    #print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt)>min_cont_area: #Limit the contours based on area?  
        box_d=cv2.boundingRect(cnt)
        x,y,w,h=box_d
        rect_d.append([x,y,w,h]) 
        cv2.rectangle(imgCont, (x,y),(x+w,y+h), (0, 0, 255),1)

i=0
roi_n=[] #store each bounding box for later
for d in range(0,len(rect_d)):    
    x=rect_d[i][0] #Find x 
    y=rect_d[i][1] #Find y 
    w=rect_d[i][2] #Find width 
    h=rect_d[i][3] #Find height 
    roi=imgFinal[y:y+h,x:x+w]
    roi_n.append(roi)
    cv2.imwrite('Boxed_ROIs_'+str(i) + '.jpg', roi) 
    i+=1

#cv2.imshow('Final Result',imgCont)
#cv2.imwrite('Final Result.jpg',imgCont)

cv2.waitKey(0)
cv2.destroyAllWindows()

Мой обновленный вывод: Update Output

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