Удалить треугольник с изображения(python, opencv)

#python #opencv

Вопрос:

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

введите описание изображения здесь

Вот мое ядро для распознавания пары треугольников. Потому что я хочу сохранить текст неизменным, поэтому я создаю ядро из пары треугольников:

 kernel = np.array([  [1,1,0,0,0,0],  [1,1,1,1,0,0],  [1,1,1,1,1,1],  [0,0,0,0,0,0],  [0,0,0,0,0,0],  [1,1,1,1,1,1],  [1,1,1,1,0,0],  [1,1,0,0,0,0] ], dtype=np.uint8)  src_img = cv2.imread("triangle_and_text.png") gray = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV   cv2.THRESH_OTSU)[1] removed_triangles = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=1) cv2.imwrite("removed_triangles.png", 255 - removed_triangles)  

введите описание изображения здесь

Где я ошибаюсь?

Ответ №1:

 import cv2 import sys import numpy as np  pth = sys.path[0]   def removeTri():  # Load image  im = cv2.imread("%s/im.png" % pth)   # Make a gray version  im_thresh = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)   # Make a black and white version  im_thresh = cv2.adaptiveThreshold(  im_thresh, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2  )   # Merge channels  im_thresh = cv2.merge((im_thresh, im_thresh, im_thresh))   # Remove small noise  im_thick = cv2.medianBlur(im_thresh, 9)   # Connect components  im_thick = cv2.erode(im_thick, np.ones((31, 31)))   # Draw a white border around shape to avoid errors in blob finding  cv2.rectangle(im_thick, (0, 0), im.shape[:2], (255, 255, 255), 10)   # To find each blob and size of each  im_out = im.copy()  im_thick = ~cv2.split(im_thick)[0]  cnts, _ = cv2.findContours(im_thick, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  cnts = list(cnts)  cnts.sort(  key=lambda p: max(cv2.boundingRect(p)[2], cv2.boundingRect(p)[3]), reverse=True  )  for cnt in cnts:  peri = cv2.arcLength(cnt, True)  approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)  x, y, w, h = cv2.boundingRect(approx)  cv2.rectangle(im_out, (x, y), (x   w, y   h), (0, 255, 0), 2)   # Draw biggest blob in blue color  x, y, w, h = cv2.boundingRect(cnts[0])  cv2.rectangle(im_out, (x, y), (x   w, y   h), (255, 0, 0), 2)   # Make a mask of text area  mask = im_thick.copy()  mask[:] = 0  cv2.rectangle(mask, (x, y), (x   w, y   h), (255, 255, 255), -1)   # Extract the final text using mask  im_res=im.copy()  im_res[np.where(mask==0)]=(255,255,255)   # Save output image  im_thick = cv2.merge((im_thick, im_thick, im_thick))  mask = cv2.merge((mask, mask, mask))  top = np.hstack((im, im_thresh, im_thick))  btm = np.hstack((im_out, mask, im_res))  cv2.imwrite("%s/im_out.png" % pth, np.vstack((top, btm)))   if __name__ == "__main__":  removeTri()  

введите описание изображения здесь