Scan_Doc_App / Segmentation.py
datdo2717's picture
new update
b440711
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)