Mặc dù một bản phác thảo kỹ thuật số sẽ không giống hệt bản vẽ bút chì thật nhưng nó vẫn đáng để thử nghiệm. Tìm hiểu cách lập trình một ứng dụng như vậy bằng mô-đun OpenCV bằng ngôn ngữ Python thân thiện.
Mô-đun OpenCV
OpenCV là một thư viện mã nguồn mở do Intel phát triển và duy trì về các phương pháp thị giác máy tính được sử dụng để xử lý hình ảnh và thị giác máy tính. Nó giúp người dùng dễ dàng tạo các ứng dụng được tối ưu hóa, tương tác với hình ảnh và video trong thời gian thực và chọn thuật toán phù hợp cho nhu cầu của họ.
Một 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, bộ lọc mạng xã hội, nhận dạng biển số ô tô và giám sát camera quan sát. Để sử dụng mô-đun OpenCV trong Python, hãy mở terminal và nhập lệnh sau:
pip install opencv-python
Cách chuyển đổi ảnh thành bản phác thảo bằng Python
Để chuyển đổi ảnh thành bản phác thảo kỹ thuật số, hãy bắt đầu bằng cách đặt nó vào cùng thư mục với chương trình Python mới. Sau đó, bắt đầu xây dựng chương trình của bạn bằng các bước sau.
Mã ví dụ này có sẵn trong kho lưu trữ GitHub và bạn được sử dụng miễn phí theo Giấy phép MIT.
Bước đầu tiên là nhập mô-đun OpenCV vào môi trường của bạn. Khi đã có OpenCV, bạn có thể sử 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 tệp hình ảnh của bạn vào hàm imread() để tải nó. Lưu trữ hình ảnh của bạn trong một biến—ở đây gọi là image1 —để tham khảo sau này.
Lưu trữ tiêu đề của cửa sổ trong một biến có tên window_name. Điều này sẽ hữu ích khi bạn chọn hiển thị hình ảnh bằng hàm imshow(). Hàm này yêu cầu hai tham số: tiêu đề và hình ảnh bạn muốn hiển thị.
import cv2
image1 = cv2.imread('image.jpg')
window_name = 'Actual image'
cv2.imshow(window_name, image1)
Sau khi có hình ảnh mong muốn, bạn cần thực hiện năm thao tác để biến nó thành một bản phác thảo. Đầu tiên, chuyển đổi hình ảnh màu thành thước xám (grayscale). Bạn có thể làm như vậy với hàm cvtColor(). Hàm này lấy hình ảnh có màu bạn muốn thay đổi và mã chuyển đổi chẳng hạn như COLOR_BGR2GRAY.
grey_img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
Khi bạn có một hình ảnh grayscale, hãy đảo ngược màu sắc của nó. Tại thời điểm này, bạn cần hiểu cách máy tính tạo thành một hình ảnh. Một hình ảnh bao gồm nhiều pixel nhỏ với cường độ khác nhau. Trong ảnh màu, mỗi pixel chứa các thành phần màu đỏ, lục và lam, mỗi thành phần có cường độ từ 0 đến 255.
Trong một hình ảnh grayscale, chỉ có các sắc thái của màu xám, vì vậy cường độ của pixel thay đổi trong khoảng từ 0 đến 1. Để đảo ngược cường độ pixel của hình ảnh này, hãy chuyển hình ảnh grayscale cho hàm bitwise_not().
Hàm này đảo ngược giá trị của mỗi pixel thành tương đương bổ sung của nó. Tất cả các pixel lớn hơn 0 được đặt thành 0 và tất cả các pixel bằng 0 được đặt thành 255.
invert = cv2.bitwise_not(grey_img)
Sau khi đảo ngược cường độ điểm ảnh, bạn có thể làm mịn hình ảnh với sự trợ giúp của Gaussian Blur. Quá trình Gaussian Blur sử dụng bộ lọc Gaussian. Bộ lọc Gaussian là bộ lọc chỉ cho phép tần số thấp đi qua, loại bỏ thành phần tần số cao của tín hiệu hoặc hình ảnh.
Hàm GaussianBlur() của OpenCV chấp nhận bốn tham số. Đây là một đối tượng ma trận đóng vai trò là hình ảnh nguồn, ksize (kích thước của hạt nhân) và sigmaX (độ lệch chuẩn hạt nhân Gaussian).
Giả sử bạn có một bức ảnh thực trong tay. Nếu bạn muốn làm mờ nó, bạn có thể dán các miếng sáp hoặc giấy da lên trên nó. Bạn có thể tưởng tượng hạt nhân giống như mảnh giấy trong suốt này. Về mặt kỹ thuật số, điều này hơi khác một chút. Để làm mờ, làm sắc nét và áp dụng các hiệu ứng khác trên hình ảnh kỹ thuật số, bạn nhân một ma trận với cường độ pixel của hình ảnh.
Ksize luôn là một số lẻ dương. Khi bạn tăng kích thước hạt nhân, độ mờ tăng lên. Để hiểu sigmaX, giả sử bạn đang bôi sáp lên giấy. Khi bạn bôi sáp, giấy trở nên mờ một cách đồng nhất. Tương tự, bạn phải giữ các giá trị của hạt nhân gần với một điểm cụ thể (giá trị trung bình). Giá trị sigmaX xác định sự khác biệt giữa giá trị trung bình và giá trị khác của pixel trong ảnh.
Chuyển hình ảnh đảo ngược, kích thước hạt nhân là (21, 21) và độ lệch chuẩn 0 cho hàm Gaussian Blur:
blur = cv2.GaussianBlur(invert, (21, 21), 0)
Truyền lại hình ảnh bị mờ cho hàm bitwise_not() để đảo ngược nó:
invertedblur = cv2.bitwise_not(blur)
Cuối cùng, sử dụng hàmdivid() và để thực hiện phân chia theo từng phần tử của mảng ảnh grayscale và mảng ảnh mờ đảo ngược với tỷ lệ 256.
sketch = cv2.divide(grey_img, invertedblur, scale=256.0)
Về cơ bản, hàm thực hiện thao tác sau:
def divide(grey_img, b, invertedblur=256.0):
return (grey_img * scale) / invertedblur
Lưu trữ kết quả trong một biến có tên sketch. Để lưu hình ảnh cuối cùng, hãy chuyển tên cho tệp đầu ra của bạn và hình ảnh phác thảo cho hàm imwrite(). Để xác minh, bạn có thể sử dụng hàm imread() để tải hình ảnh phác thảo đã lưu, đặt tiêu đề cửa sổ và hiển thị nó bằng hàm imshow().
Sử dụng hàm waitkey() bằng cách chuyển 0 để hiển thị cửa sổ ảnh gốc và cửa sổ phác thảo đã tạo cho đến khi bạn nhấn bất kỳ phím nào.
cv2.imwrite("sketch.jpeg", sketch)
image = cv2.imread("sketch.jpeg")
window_name ='Sketch image'
cv2.imshow(window_name, image)
cv2.waitKey(0)
Gộp tất cả mã lại với nhau và bạn đã sẵn sàng cho chương trình của mình.
Ví dụ minh họa
Bạn có thể chọn một ảnh phong cảnh và chạy nó thông qua chương trình để tạo bản phác thảo kỹ thuật số.
Trên ảnh chân dung, chương trình tạo bản phác thảo kỹ thuật số sau.
Bạn có thể thử nghiệm các tham số của chức năng theo ý thích của mình để tạo bản phác thảo như mong muốn.
Xử lý hình ảnh và thị giác máy tính
Xử lý hình ảnh và thị giác máy tính là hai lĩnh vực công nghệ có liên quan mật thiết với nhau. Cả hai đều liên quan đến việc thay đổi hình ảnh kỹ thuật số để đạt được kết quả mong muốn. Xử lý hình ảnh tập trung vào việc cải thiện hình ảnh, trong khi thị giác máy tính tìm kiếm các mẫu và đối tượng trong hình ảnh để hiểu nó.
>>> Nếu bạn đang có nhu cầu học lập trình trực tuyến, tìm hiểu ngay tại đây:
Vân Nguyễn
Dịch từ: https://www.makeuseof.com/python-image-sketch-convert/











Bình luận (0
)