banner



Draw Bounding Box On Image Python Opencv

I am doing a college class project on image processing. This is my original image: enter image description here

I want to join nearby/overlapping bounding boxes on individual text line images, but I don't know how. My code looks like this so far (thanks to @HansHirse for the help):

          import os import cv2 import numpy as np from scipy import stats image = cv2.imread('example.png')  gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)  #dilation kernel = np.ones((5,5), np.uint8) img_dilation = cv2.dilate(thresh, kernel, iterations=1)  #find contours ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # https://www.pyimagesearch.com/2015/04/20/sorting-contours-using-python-and-opencv/ def sort_contours(cnts, method="left-to-right"):     # initialize the reverse flag and sort index     reverse = False     i = 0      # handle if we need to sort in reverse     if method == "right-to-left" or method == "bottom-to-top":         reverse = True      # handle if we are sorting against the y-coordinate rather than     # the x-coordinate of the bounding box     if method == "top-to-bottom" or method == "bottom-to-top":         i = 1      # construct the list of bounding boxes and sort them from top to     # bottom     boundingBoxes = [cv2.boundingRect(c) for c in cnts]     (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),                                         key=lambda b: b[1][i], reverse=reverse))      # return the list of sorted contours and bounding boxes     return (cnts, boundingBoxes)  sortedctrs,sortedbbs=sort_contours(ctrs) xyminmax=[] for cnt in sortedctrs:     x, y, w, h = cv2.boundingRect(cnt)     xyminmax.append([x,y,x+w,y+h])  distances=[] for i in range(len(xyminmax)):     try:         first_xmax = xyminmax[i][2]         second_xmin = xyminmax[i + 1][0]         distance=abs(second_xmin-first_xmax)         distances.append(distance)     except IndexError:         pass  THRESHOLD=stats.mode(distances, axis=None)[0][0]  new_rects=[] for i in range(len(xyminmax)):     try:         # [xmin,ymin,xmax,ymax]         first_ymin=xyminmax[i][1]         first_ymax=xyminmax[i][3]          second_ymin=xyminmax[i+1][1]         second_ymax=xyminmax[i+1][3]          first_xmax = xyminmax[i][2]         second_xmin = xyminmax[i+1][0]          firstheight=abs(first_ymax-first_ymin)         secondheight=abs(second_ymax-second_ymin)          distance=abs(second_xmin-first_xmax)          if distance<THRESHOLD:             new_xmin=xyminmax[i][0]             new_xmax=xyminmax[i+1][2]             if first_ymin>second_ymin:                 new_ymin=second_ymin             else:                 new_ymin = first_ymin              if firstheight>secondheight:                 new_ymax = first_ymax             else:                 new_ymax = second_ymax             new_rects.append([new_xmin,new_ymin,new_xmax,new_ymax])         else:             new_rects.append(xyminmax[i])     except IndexError:         pass  for rect in new_rects:     cv2.rectangle(image, (rect[0], rect[1]), (rect[2], rect[3]), (121, 11, 189), 2) cv2.imwrite("result.png",image)                  

which produces this image as a result: Text line images with bounding boxes

I want to join very close or overlapping bounding boxes such as these

enter image description here

enter image description here

into a single bounding box so the formula doesn't get separated into single characters. I have tried using cv2.groupRectangles but the print results were just NULL.

Draw Bounding Box On Image Python Opencv

Source: https://coderedirect.com/questions/363536/how-to-join-nearby-bounding-boxes-in-opencv-python

Posted by: mcdonnellturper.blogspot.com

0 Response to "Draw Bounding Box On Image Python Opencv"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel