from ultralytics import YOLO import cv2 import os import shutil import numpy as np def black_mask(results): # Đường dẫn đến thư mục "runs" runs_folder = "mask" # Kiểm tra xem thư mục "mask" đã tồn tại chưa if not os.path.exists(runs_folder): # Nếu chưa tồn tại, tạo thư mục "mask" os.makedirs(runs_folder) bl_mask=[] for mask_index in range(len(results[0].masks)): # Lấy mặt nạ mask_raw = results[0].masks[mask_index].cpu().data.numpy().transpose(1, 2, 0) # Chuyển đổi mặt nạ thành 3 kênh màu mask_3channel = cv2.merge((mask_raw, mask_raw, mask_raw)) # Lấy kích thước của ảnh gốc (chiều cao, chiều rộng, số kênh) h2, w2, c2 = results[0].orig_img.shape # Thay đổi kích thước mặt nạ thành cùng kích thước với ảnh gốc mask = cv2.resize(mask_3channel, (w2, h2)) # Chuyển đổi ảnh mặt nạ thành không gian màu HSV hsv = cv2.cvtColor(mask, cv2.COLOR_BGR2HSV) # Xác định phạm vi độ sáng trong không gian màu HSV lower_black = np.array([0, 0, 0]) upper_black = np.array([0, 0, 1]) # Tạo mặt nạ dựa trên phạm vi độ sáng mask = cv2.inRange(mask, lower_black, upper_black) # Đảo ngược mặt nạ để lấy mọi thứ trừ màu đen mask = cv2.bitwise_not(mask) # Áp dụng mặt nạ vào ảnh gốc masked = cv2.bitwise_and(results[0].orig_img, results[0].orig_img, mask=mask) # Chuyển mọi pixel màu đen thành màu trắng black_color = [0, 0, 0] white_color = [255, 255, 255] result_image = np.where(np.all(masked == black_color, axis=-1, keepdims=True), masked, white_color) # name = "mask/"+str(mask_index) + '.png' # # Show the masked part of the image # cv2.imwrite(name,result_image) bl_mask.append(result_image) return bl_mask def segmentation_doc(image): model = YOLO('Model/Seg65ep.pt') runs_folder = "runs" folder="mask" # Xóa thư mục runs if os.path.exists(runs_folder) and os.path.isdir(runs_folder): # Xóa thư mục runs shutil.rmtree(runs_folder) if os.path.exists(folder) and os.path.isdir(folder): # Xóa thư mục runs shutil.rmtree(folder) color = [255, 255, 255] # Màu trắng padding_size = 50 image = cv2.copyMakeBorder(image, padding_size, padding_size, padding_size, padding_size, cv2.BORDER_CONSTANT, value=color) results = model(image,save=True,retina_masks = True, conf=0.7) bl_mask=black_mask(results) return image,bl_mask # image=cv2.imread("test1.jpg") # segmentation_doc(image)