Để tách lớp xử lý ảnh tổ chức đoạn code thành các class giúp quản lý tốt hơn, bạn có thể chia chức năng của việc xử lý ảnh thành các lớp riêng biệt. Dưới đây là cách chia đoạn code thành hai lớp: một lớp để quản lý các tham số chuyển đổi và một lớp để thực hiện xử lý ảnh.
Lớp này sẽ lưu trữ các tham số chuyển đổi như loại chuyển đổi (flip, rotate,…), độ sáng, độ tương phản, v.v.
class TransformParams: def __init__(self, data): self.transform_type = data.get('transform') self.image_path = data.get('image_path') self.params = data.get('params', {}) self.p = self.params.get('p', 1.0) self.limit = self.params.get('limit', 90) self.blur = self.params.get('blur', 0) self.sharpen = self.params.get('sharpen', 0) self.brightness = self.params.get('brightness', 1.0) self.contrast = self.params.get('contrast', 1.0) self.noise = self.params.get('noise', 0)
Lớp này sẽ thực hiện việc xử lý ảnh theo các tham số đã cung cấp.
class ImageTransformer: def __init__(self, params: TransformParams): self.params = params def validate_image(self): if not self.params.image_path or not os.path.exists(self.params.image_path): return False, {"error": "Invalid image path"}, 400 return True, None, None def load_image(self): image = cv2.imread(self.params.image_path) return cv2.cvtColor(image, cv2.COLOR_BGR2RGB) def apply_transforms(self, image): transforms = [] if self.params.transform_type == 'horizontal_flip': transforms.append(A.HorizontalFlip(p=self.params.p)) elif self.params.transform_type == 'vertical_flip': transforms.append(A.VerticalFlip(p=self.params.p)) elif self.params.transform_type == 'rotate_90': transforms.append(A.Rotate(limit=(self.params.limit, self.params.limit), p=self.params.p)) if self.params.blur > 0: blur_limit = (self.params.blur, self.params.blur) if self.params.blur % 2 == 1 else (self.params.blur - 1, self.params.blur - 1) transforms.append(A.GaussianBlur(blur_limit=blur_limit, p=1.0)) if self.params.sharpen > 0: transforms.append(A.Sharpen(p=1.0)) if self.params.brightness != 1.0 or self.params.contrast != 1.0: transforms.append(A.RandomBrightnessContrast(brightness_limit=(self.params.brightness-1, self.params.brightness-1), contrast_limit=(self.params.contrast-1, self.params.contrast-1), p=1.0)) if self.params.noise > 0: transforms.append(A.GaussNoise(var_limit=(self.params.noise, self.params.noise), p=1.0)) if transforms: transform = A.Compose(transforms) augmented = transform(image=image) return augmented['image'] return image def save_image(self, image, output_path): plt.imsave(output_path, image) return output_path
Sử dụng hai lớp TransformParams và ImageTransformer trong hàm điều khiển (controller) để xử lý yêu cầu:
@main.route('/api/transform', methods=['POST']) def transform_image(): # Lấy toàn bộ payload từ yêu cầu data = request.json # Tạo đối tượng TransformParams transform_params = TransformParams(data) # Tạo đối tượng ImageTransformer image_transformer = ImageTransformer(transform_params) # Kiểm tra đường dẫn ảnh is_valid, error_response, status_code = image_transformer.validate_image() if not is_valid: return jsonify(error_response), status_code # Đọc và xử lý ảnh image = image_transformer.load_image() image = image_transformer.apply_transforms(image) # Lưu ảnh đã xử lý vào thư mục processed_images processed_image_path = os.path.join(PROCESSED_FOLDER, 'processed_image.jpg') image_transformer.save_image(image, processed_image_path) return jsonify({"message": "Image transformed successfully", "processed_image_path": processed_image_path}), 200
Việc chia code theo lớp giúp quản lý tốt hơn, dễ dàng mở rộng và bảo trì trong tương lai.
Leave A Comment