Cách chuyển ảnh thành tranh vẽ bằng Python

Python có thể giúp bạn chuyển ảnh thành tranh vẽ dễ dàng. Dưới đây là chi tiết từng bước cách lập trình một app qua mô đun OpenCV bằng Python để chuyển ảnh thành tranh vẽ.

Mô đun OpenCV

OpenCV là một thư viện mã nguồn mở về các phương pháp thị giác máy tính do Intel phát triển. Nó được dùng để xử lý ảnh và các vấn đề liên quan tới thị giác máy tính. Nó giúp người dùng tối ưu hóa ứng dụng, tạo tương tác ảnh/video tại thời gian thật đơn giản và chọn thuật ngữ lý tưởng cho nhu cầu của họ.

Một vài trong số ứng dụng phổ biến của OpenCV bao gồm nhận diện khuôn mặt, theo dõi khuôn mặt tự động trong quay phim, lọc mạng xã hội, nhận diện biển số xe, giám sát CCTV. Để dùng mô đun OpenCV trong Python, mở terminal và nhập lệnh sau:

pip install opencv-python

Cách chuyển đổi ảnh thành tranh phác thảo bằng Python

Bắt đầu bằng cách đặt nó trong cùng một thư mục dưới dạng chương trình Python mới để dễ dàng tham chiếu. Sau đó, bắt đầu xây dựng chương trình theo các bước sau:

Đầu tiên là nhập mô đun OpenCV vào môi trường của bạn. Khi OpenCV có sẵn, bạn có thể dùng chức năng của nó để thực hiện các nhiệm vụ khác nhau. Chuyển đường dẫn của file ảnh vào hàm imread() để tải nó. Lưu ảnh trong biến image1 để tham chiếu trong tương lai.

Lưu tiêu đề của cửa sổ trong biến window_name. Điều này hữu ích khi bạn chọn hiện ảnh bằng hàm imshow(). Hàm này cần hai tham số: tên và ảnh bạn muốn hiển thị.

import cv2

image1 = cv2.imread('image.jpg')
window_name = 'Actual image'
cv2.imshow(window_name, image1)

Khi đã có ảnh mong muốn, bạn cần thực hiện 5 thao tác để biến nó thành một bản phác thảo. Đầu tiên, chuyển đổi ảnh màu sang thang xám. Bạn có thể làm việc này bằng cvtColor(). Hàm này lấy hình ảnh có màu mà bạn muốn thay đổi và một code chuyển đổi như COLOR_BGR2GRAY.

grey_img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

Khi có một ảnh ở thang độ xám, hãy đảo ngược màu sắc của nó. Lúc này, bạn cần hieru cách máy tính định hình một ảnh.

Một ảnh chứa nhiều điểm ảnh nhỏ với mật độ khác nhau. Với ảnh màu, mỗi pixel chứa màu đỏ, xanh lá và xanh dương với mật độ từ 0 tới 255.

Ảnh ở thang độ xám chỉ có sắc màu xám. Do đó, mật độ điểm ảnh thay đổi giữa 0 và 1. Để đảo ngược mật độ pixel của ảnh này, chuyển ảnh thang xám tới hàm bitwise_not().

Đúng như tên gợi ý, hàm này đảo ngược giá trị của từng pixel tới thành phần tương đương bổ sung của nó. Tất cả pixel lớn hơn 0 đều được thiết lập bằng 0. Toàn bộ pixel bằng 0 được đặt thành 255.

invert = cv2.bitwise_not(grey_img)

Sau khi đảo ngược mật độ pixel, bạn có thể làm mượt ảnh với sự trợ giúp của Gaussian Blur. Nó dùng bộ lọc Gaussian để chỉ cho phép các tần số thấp đi qua.

Hàm GaussianBlur() chấp nhận 4 tham số. Chúng là một đối tượng ma trậm hoạt động như ảnh nguồn, kích thước của kernel (ksize) và sigmaX.

Giả sử bạn có ảnh vật lý trong tay. Nếu muốn làm mờ nó, bạn có thể áp dụng miến sáp hoặc giấy nhám phủ lên trên. Bạn có thể hình dung kernel như một mẩu giấy trong suốt. Về mặt kỹ thuật số, quá trình hơi khác một chút Để làm mờ, sắc nét và áp dụng các hiệu ứng khác trên một ảnh kỹ thuật số, bạn nhân một ma trận với mật độ pixel của ảnh.

Kzize luôn là một số lẻ dương. Khi bạn tăng kích thước kernel, độ mờ cũng tăng. Giá trị sigmaX xác định sự khác biệt giữa độ trung bình và giá trị khác của pixel trong một ảnh.

Chuyển ảnh được đảo ngược, kích thước kernel là (21,21) và độ lệch chuẩn 0 cho hàm Gaussian Blur:

blur = cv2.GaussianBlur(invert, (21, 21), 0)

Chuyển ảnh bị mờ sang hàm bitwise_not() lần nữa để chuyển đổi nó:

invertedblur = cv2.bitwise_not(blur)

Cuối cùng, dùng hàm divide() để thực hiện phân chia từng thành phần của mảng ảnh ở thang độ xám và mảng ảnh mờ được đảo ngược với thang độ 256.

sketch = cv2.divide(grey_img, invertedblur, scale=256.0)

Về cơ bản, hàm này thực hiện các lệnh sau:

def divide(grey_img, b, invertedblur=256.0):
    return (grey_img * scale) / invertedblur

Lưu kết quả trong file phác thảo được đặt tên có thể tùy biến. Để lưu ảnh cuối cùng, bỏ qua tên cho tệp đầu ra và ảnh phác thảo sang hàm imwrite(). Để xác thực nó, bạn có thể dùng hàm imread() để tải ảnh phác thảo đã lưu, đặt tên cửa sổ và hiện nó bằng hàm imshow().

Dùng hàm waitkey() bằng cách chuyển 0 để hiện cửa sổ ảnh gốc và cửa sổ phác thảo được tạo cho tới khi bạn nhấn vào phím bất kỳ.

cv2.imwrite("sketch.jpeg", sketch)
image = cv2.imread("sketch.jpeg")
window_name ='Sketch image'
cv2.imshow(window_name, image)
cv2.waitKey(0)

Kết hợp tất cả code với nhau và bạn có một chương trình chuyển đổi ảnh sẵn sàng hoạt động.

Chuyển ảnh thành tranh vẽ

Thứ Ba, 31/01/2023 17:07
51 👨 862
0 Bình luận
Sắp xếp theo