- 1. Hoạt động Bitwise và tạo mặt nạ
- 2. Chuyển đổi & Làm mờ
- 3. Làm sắc nét - Đảo ngược hình ảnh làm mờ
- 4. Threshoding (Binarization)
- 5. Sự giãn nở, xói mòn, mở / đóng
- 6. Phát hiện cạnh và chuyển màu hình ảnh
- 14. Chuyển đổi phối cảnh & liên kết
- 8. Ứng dụng phác thảo trực tiếp
Trong các hướng dẫn trước, chúng ta đã tìm hiểu về OpenCV và thực hiện một số xử lý ảnh cơ bản và sau đó trong hướng dẫn tiếp theo, chúng ta đã thực hiện một số thao tác với ảnh trong OpenCV như cắt, xoay, chuyển đổi ảnh, v.v. một số kỹ thuật thao tác hình ảnh khác như và ở cuối hướng dẫn, chúng tôi sẽ xây dựng một chương trình python-opencv để tạo bản phác thảo trực tiếp từ nguồn cấp dữ liệu trực tiếp của webcam. Ứng dụng này sẽ sử dụng nhiều chức năng xử lý hình ảnh mà chúng ta đã học cho đến nay hoặc sẽ học trong hướng dẫn này, vì vậy đây sẽ là một ví dụ thực tế tốt để bao gồm tất cả các chức năng.
Như đã nói trong hướng dẫn trước, OpenCV là Thư viện Nguồn mở Commuter Vision có giao diện C ++, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. Vì vậy, nó có thể dễ dàng cài đặt trong Raspberry Pi với môi trường Python và Linux. Và Raspberry Pi với OpenCV và camera kèm theo có thể được sử dụng để tạo nhiều ứng dụng xử lý hình ảnh thời gian thực như Nhận diện khuôn mặt, khóa khuôn mặt, theo dõi đối tượng, phát hiện biển số ô tô, Hệ thống an ninh gia đình, v.v.
Trong hướng dẫn này, chúng ta sẽ xem thêm một số thao tác hình ảnh bằng Python OpenCV. Ở đây chúng ta sẽ học cách áp dụng hàm sau trên một hình ảnh bằng Python OpenCV:
- Hoạt động Bitwise và tạo mặt nạ
- Chuyển đổi & Làm mờ
- Làm sắc nét - Đảo ngược hình ảnh làm mờ
- Lập ngưỡng (Binarization)
- Sự giãn nở, xói mòn, mở / đóng
- Phát hiện cạnh và chuyển màu hình ảnh
- Chuyển đổi phối cảnh & liên kết
- Ứng dụng phác thảo trực tiếp
1. Hoạt động Bitwise và tạo mặt nạ
Các thao tác bitwise giúp bạn tạo mặt nạ hình ảnh và giúp bạn tạo một số hình ảnh đơn giản.
Tạo hình vuông
import cv2 import numpy là np # chúng tôi chỉ sử dụng hai kích thước vì đây là hình ảnh thang độ xám, nếu chúng tôi đang sử dụng hình ảnh # màu, thì chúng tôi đã sử dụng một hình chữ nhật = np.zeros ((300,300,3), np.uint8) # Tạo hình vuông vuông = np.zeros ((300.300), np.uint8) cv2.rectangle (square, (50,50), (250,250), 255, -1) cv2.imshow ("square", square) cv2. waitKey (0)
Tạo hình elip
ellipse = np.zeros ((300,300), np.uint8) cv2.ellipse (ellipse, (150,150), (150,150), 30,0,180,255, -1) cv2.imshow ("ellipse", ellipse) cv2.waitKey (0)
Thử nghiệm với các hoạt động bitwise
#AND_s chỉ hiển thị nơi hai điểm giao nhau
BitwiseAND = cv2.bitwise_and (hình vuông, hình elip) cv2.imshow ("VÀ", BitwiseAND) cv2.waitKey (0)
#OR_chỉ hiển thị ở vị trí hình vuông hoặc hình elip
BitwiseOR = cv2.bitwise_or (vuông, elip) cv2.imshow ("HOẶC", BitwiseOR) cv2.waitKey (0)
#XOR_shows chỉ khi một trong hai tồn tại
BitwiseXOR = cv2.bitwise_xor (hình vuông, hình elip) cv2.imshow ("XOR", BitwiseXOR) cv2.waitKey (0)
#NOT_shows tất cả mọi thứ không phải là một phần của hình elip và hoạt động KHÔNG chỉ có thể được áp dụng cho một hình
BitwiseNOT_elp = cv2.bitwise_not (ellipse) cv2.imshow ("NOT_ellipse", BitwiseNOT_elp) cv2.waitKey (0) cv2.destroyAllWindows ()
2. Chuyển đổi & Làm mờ
Một phép tích chập là một phép toán được thực hiện trên hai hàm tạo ra hàm thứ ba thường là phiên bản sửa đổi của hàm gốc.
Hình ảnh đầu ra = hình ảnh Chức năng Kích thước hạt nhân
Trong thị giác máy tính, chúng tôi sử dụng hạt nhân để chỉ định kích thước mà chúng tôi chạy chức năng thao tác trên hình ảnh của mình.
Làm mờ là một thao tác trong đó chúng tôi tính trung bình các pixel trong một vùng (Kernel)
OpenCV làm mờ một hình ảnh bằng cách áp dụng các hạt nhân, một hạt nhân cho bạn biết cách thay đổi giá trị của bất kỳ pixel nhất định nào bằng cách kết hợp nó với số lượng pixel lân cận khác nhau mà nhân được áp dụng cho từng pixel trong ảnh để tạo ra hình ảnh cuối cùng.
Nói một cách đơn giản, một phép chập hình ảnh chỉ đơn giản là một phép nhân khôn ngoan của hai ma trận theo sau bởi một tổng.
Chúng ta có thể hiểu một cách đơn giản bằng ví dụ sau.
Ở trên là Kernel 3X3.
Chúng tôi nhân với 1/25 để bình thường hóa tức là tổng thành 1, chúng tôi đã tăng cường độ hoặc giảm cường độ như trong trường hợp làm sáng hoặc tối của hình ảnh.
Hãy kiểm tra phương pháp làm mờ opencv filter2D, được cung cấp bởi hàm cv2.filter2D (image, -1, kernel)
import cv2 import numpy as np image = cv2.imread (' voi.jpg ') cv2.imshow ('original', image) cv2.waitKey (0)
# tạo ma trận hạt nhân 3x3
kernel_3x3 = np.ones ((3,3), np.float32) / 9
# chúng tôi sử dụng cv2.filter2D để chuyển đổi hạt nhân với một hình ảnh
mờ = cv2.filter2D (hình ảnh, -1, kernel_3x3) cv2.imshow ('3x3_blurring', làm mờ) cv2.waitKey (0)
# tạo ma trận hạt nhân 7x7
kernel_7x7 = np.ones ((7,7), np.float32) / 49
# chúng tôi sử dụng cv2.filter2D để chuyển đổi hạt nhân với một hình ảnh
mờ = cv2.filter2D (hình ảnh, -1, kernel_7x7) cv2.imshow ('7x7_blurring', làm mờ) cv2.waitKey (0) cv2.destroyAllWindows ()
Ngoài ra còn có các loại phương pháp làm mờ khác:
cv2.blur - Giá trị trung bình trên một cửa sổ được chỉ định.
cv2.GaussianBlur - Tương tự nhưng sử dụng cửa sổ Gaussian (nhấn mạnh hơn vào các điểm xung quanh trung tâm).
cv2.medianBlur– Sử dụng giá trị trung bình của tất cả các phần tử trong cửa sổ.
cv2.bilateralFilter– Làm mờ trong khi vẫn giữ cho các cạnh sắc nét, nó bảo vệ các cạnh và chi tiết đường nét.
Chúng ta sẽ thấy từng cái một bên dưới, trước tiên hãy hiển thị hình ảnh gốc bằng cách sử dụng mã bên dưới:
import cv2 import numpy as np image = cv2.imread (' voi.jpg ') cv2.imshow ('original', image) cv2.waitKey (0)
cv2.blur:
Trong phương pháp này, tính trung bình được thực hiện bằng cách xoay hình ảnh với bộ lọc hộp chuẩn hóa, điều này diễn ra bên dưới hộp và thay thế phần tử trung tâm. Ở đây kích thước hộp cần phải là số lẻ và số dương .
# cv2.blur Blur = cv2.blur (image, (3,3)) cv2.imshow ('Averaging', Blur) cv2.waitKey (0)
cv2.GaussianBlur:
# cv2.GaussianBlur #instead of box filter, hãy thử Gaussian kernel Gaussian = cv2.GaussianBlur (image, (7,7), 0) cv2.imshow ('Gaussian blurring', Gaussian) cv2.waitKey (0)
cv2.medianBlur:
Nó lấy giá trị trung bình của tất cả các pixel trong vùng nhân và phần tử trung tâm được thay thế bằng giá trị trung bình này.
# cv2.medianBlur # lấy giá trị trung bình của tất cả các pixel trong vùng nhân và phần tử trung tâm # được thay thế bằng giá trị trung bình này. trung bình = cv2.medianBlur (hình ảnh, 5) cv2.imshow ('trung bình mờ', trung bình) cv2.waitKey (0)
cv2.bilateralFilter:
Song phương rất hiệu quả trong việc loại bỏ tiếng ồn trong khi giữ cho các cạnh sắc nét
# cv2.bilateralFilter #Bilateral rất hiệu quả trong việc loại bỏ nhiễu trong khi vẫn giữ các cạnh sắc nét song phương = cv2.bilateralFilter (hình ảnh, 9,75,75) cv2.imshow ('làm mờ hai bên', song phương) cv2.waitKey (0) cv2. killAllWindows ()
Khử nhiễu hình ảnh không cục bộ có nghĩa là Khử nhiễu
import cv2 import numpy as np image = cv2.imread (' voi.jpg ') cv2.imshow ('original', image) cv2.waitKey (0)
#parameter sau None là sức mạnh lọc 'h' (5-10 là một phạm vi tốt) #next là h cho các thành phần màu sắc, thiết lập như là cùng một giá trị như h lại
dst = cv2.fastNlMeansDenoisingColored (hình ảnh, Không có, 6,6,7,21) cv2.imshow ('Nhanh có nghĩa là giảm giá trị', dst) cv2.waitKey (0) cv2.destroyAllWindows ()
Có 4 biến thể của các phương tiện phi địa phương biểu thị
cv2.fastNlMeansDenoising () - cho hình ảnh thang màu xám duy nhất
cv2.fastNlMeansDenoisingColored () - Hình ảnh một màu
cv2.fastNlmeansDenoisingMulti () - cho thang độ xám của chuỗi hình ảnh
cv2.fastNlmeansDenoisingcoloredMulti () - cho chuỗi hình ảnh được tô màu
3. Làm sắc nét - Đảo ngược hình ảnh làm mờ
Làm sắc nét trái ngược với làm mờ, nó tăng cường hoặc nhấn mạnh vào các cạnh trong hình ảnh.
Kernel =,,
Ma trận hạt nhân của chúng tôi tính tổng lên đến một, vì vậy không cần chuẩn hóa (tức là nhân với một hệ số để có cùng độ sáng như ban đầu), nếu hạt nhân không được chuẩn hóa thành 1, hình ảnh sẽ sáng hơn hoặc tối hơn.
import cv2 import numpy as np image = cv2.imread (' voi.jpg ') cv2.imshow ('original', image) cv2.waitKey (0)
kernel_sharpening = np.array (,
])
# áp dụng nhân làm sắc nét cho hình ảnh đầu vào
sharpned = cv2.filter2D (hình ảnh, -1, kernel_sharpening) cv2.imshow ('hình ảnh được làm sắc nét', được làm sắc nét) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Threshoding (Binarization)
Thresholding là hành động chuyển đổi một hình ảnh thành dạng nhị phân. Trong opencv có một chức năng riêng biệt để tạo ngưỡng được định nghĩa là
Cv2.threshold (hình ảnh, giá trị ngưỡng, giá trị tối đa, loại ngưỡng)
Có các loại ngưỡng sau:
- cv2.THRESH_BINARY - phổ biến nhất
- cv2. THRESH_BINARY_INV - phổ biến nhất
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2. THRESH_TOZERO_INV
LƯU Ý: cần chuyển đổi hình ảnh sang thang độ xám trước khi đặt ngưỡng
import cv2 import numpy dưới dạng np #load image dưới dạng grayscale image = cv2.imread ('gradient.jpg', 0) cv2.imshow ('original', image) cv2.waitKey (0)
#value dưới 127 chuyển thành 0 (đen) và trên 127 chuyển thành 255 (trắng)
_, thresh1 = cv2.threshold (hình ảnh, 127,255, cv2.THRESH_BINARY) cv2.imshow ('1 ngưỡng', thresh1) cv2.waitKey (0)
# giá trị dưới 127 chuyển thành 255 và giá trị trên 127 chuyển thành 0 (ngược lại ở trên)
_, thresh2 = cv2.threshold (hình ảnh, 127,255, cv2.THRESH_BINARY_INV) cv2.imshow ('2 ngưỡng', thresh2) cv2.waitKey (0)
#value trên 127 được cắt ngắn (giữ) ở 127, đối số 255 không được sử dụng.
_, thresh3 = cv2.threshold (image, 127,255, cv2.THRESH_TRUNC) cv2.imshow ('3 thresh trunc', thresh3) cv2.waitKey (0)
# giá trị dưới 127 chuyển thành 0, trên 127 không đổi
_, thresh4 = cv2.threshold (hình ảnh, 127,255, cv2.THRESH_TOZERO) cv2.imshow ('4 ngưỡng', thresh4) cv2.waitKey (0)
#Revesrse trên, dưới 127 không đổi, trên 127 về 0
_, thresh5 = cv2.threshold (hình ảnh, 127,255, cv2.THRESH_TOZERO_INV) cv2.imshow ('5 ngưỡng', thresh5) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Sự giãn nở, xói mòn, mở / đóng
Đây là các phép toán trong lĩnh vực hình thái toán học
Dilation - nó thêm pixel vào ranh giới của đối tượng trong một hình ảnh.
Xói mòn - Loại bỏ các pixel ở ranh giới của đối tượng trong hình ảnh.
Mở - Xói mòn theo sau là giãn nở.
Sự đóng lại - Sự giãn nở kéo theo sự xói mòn.
Mở rất hữu ích trong việc khử nhiễu hình ảnh vì đầu tiên nó làm mỏng hình ảnh bằng cách xói mòn (loại bỏ nhiễu) và sau đó làm giãn nó.
Lẫn lộn với sự giãn nở và xói mòn
Đôi khi có sự nhầm lẫn giữa sự giãn nở và xói mòn thường xảy ra trong các hình ảnh có nền trắng, vì opencv coi nền trắng là hình ảnh bị giãn ra hoặc bị xói mòn thay vì hình ảnh gốc, vì vậy trong trường hợp này xói mòn hoạt động như sự giãn nở và ngược lại, như được hiển thị trong mẫu hình hiển thị bên dưới.
Hãy nhớ rằng, Dilation thêm các điểm ảnh vào ranh giới của các đối tượng trong một hình ảnh trong khi Xói mòn loại bỏ các điểm ảnh ở ranh giới của các đối tượng trong một hình ảnh
import cv2 import numpy as np image = cv2.imread ('Imagecv.png', 0) cv2.imshow ('original', image) cv2.waitKey (0)
# Xói mòn
# hãy xác định kích thước hạt nhân của chúng ta
kernel = np.ones ((5,5), np.uint8)
#now chúng tôi làm xói mòn hình ảnh, ở đây lặp đi lặp lại không phải là lúc bạn muốn làm xói mòn hình ảnh
xói mòn = cv2.erode (hình ảnh, hạt nhân, lần lặp = 1) cv2.imshow ('Xói mòn', xói mòn) cv2.waitKey (0)
#dilation
dilation = cv2.dilate (image, kernel, iterations = 1) cv2.imshow ('dilation', dilation) cv2.waitKey (0)
# openning, Tốt để loại bỏ tiếng ồn
open = cv2.morphologyEx (image, cv2.MORPH_OPEN, kernel) cv2.imshow ('opens', đang mở) cv2.waitKey (0)
#closing, Tốt để loại bỏ tiếng ồn
close = cv2.morphologyEx (image, cv2.MORPH_CLOSE, kernel) cv2.imshow ('close', đóng) cv2.waitKey (0) cv2.destroyAllWindows ()
6. Phát hiện cạnh và chuyển màu hình ảnh
Phát hiện cạnh là lĩnh vực rất quan trọng trong thị giác máy tính, đặc biệt là khi xử lý các đường viền.
Các cạnh có thể được định nghĩa là ranh giới của hình ảnh, thực ra chúng là các cạnh xác định đối tượng trong hình ảnh mà chúng lưu giữ rất nhiều thông tin về hình ảnh.
Về mặt hình thức Các cạnh có thể được định nghĩa là những thay đổi đột ngột (không liên tục) trong một hình ảnh và chúng có thể mã hóa nhiều thông tin như pixel.
Hình ảnh trên cho thấy cách thị giác máy tính xác định và nhận dạng hình ảnh.
Các thuật toán phát hiện cạnh: - Có ba loại thuật toán phát hiện cạnh chính
- Sobel - để nhấn mạnh vào hình ảnh dọc hoặc ngang.
- Laplacian - tối ưu do tỷ lệ lỗi thấp, các cạnh được xác định rõ và phát hiện chính xác.
- Thuật toán phát hiện Canny Edge (do john.F.Canny phát triển năm 1986)
1. Áp dụng làm mờ Gaussian
2. Tìm gradient cường độ của hình ảnh
3. áp dụng triệt tiêu không tối đa (tức là loại bỏ các điểm ảnh không phải là cạnh).
4. Độ trễ áp dụng ngưỡng (nghĩa là nếu pixel nằm trong ngưỡng trên và ngưỡng dưới, nó được coi là cạnh)
import cv2 import numpy as np image = cv2.imread ('input.jpg', 0) height, width = image.shape
#sobel
#extraction sobel edge
sobel_x = cv2.Sobel (image, cv2.CV_64F, 0,1, ksize = 5) sobel_y = cv2.Sobel (image, cv2.CV_64F, 1,0, ksize = 5) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('sobelx', sobel_x) cv2.waitKey (0)
#Sobely
cv2.imshow ('sobely', sobel_y) cv2.waitKey (0)
sobel_OR = cv2.bitwise_or (sobel_x, sobel_y) cv2.imshow ('sobelOR', sobel_OR) cv2.waitKey (0)
#laplaian
laplacian = cv2.Laplacian (hình ảnh, cv2.CV_64F) cv2.imshow ('Laplacian', laplacian) cv2.waitKey (0)
Thuật toán phát hiện cạnh #canny sử dụng các giá trị gradient làm ngưỡng
# trong canny chúng tôi cần cung cấp hai giá trị: ngưỡng1 và ngưỡng2.
# nhiều gradient lớn hơn ngưỡng 2 được coi là một cạnh.
# nhiều gradient lớn hơn ngưỡng 1 được coi là không có cạnh.
# giá trị ở giữa ngưỡng 1 và ngưỡng 2 là cạnh hoặc không cạnh
# đối với cách các cường độ của chúng được kết nối, trong trường hợp này, bất kỳ giá trị nào dưới 60 đều được coi là
# không cạnh khi bất kỳ giá trị nào trên 120 đều được coi là cạnh.
canny = cv2.Canny (hình ảnh, 60,120) cv2.imshow ('canny', canny) cv2.waitKey (0) cv2.destroyAllWindows ()
14. Chuyển đổi phối cảnh & liên kết
Hãy lùi lại một chút và xem xét các phép biến đổi affine và không affine, hình ảnh ban đầu được hiển thị bên dưới rõ ràng là một hình ảnh không phải affine vì các cạnh sẽ gặp nhau tại một số điểm, tuy nhiên, chúng ta có thể làm thẳng nó bằng cách uốn cong và lấy phối cảnh biến đổi.
Đối với phép biến đổi phối cảnh này, chúng ta cần bốn tọa độ của hình ảnh gốc và sau đó là bốn điểm của hình ảnh đầu ra, chúng được ký hiệu là điểm_A và điểm_B. Đầu tiên với sự trợ giúp của những điểm này, chúng tôi tính toán một ma trận biến đổi, M với sự trợ giúp của hàm getPerspectiveTransform.
Và sau đó ma trận này được đưa cho hàm warpPerspective để tạo ra kết quả cuối cùng.
Bây giờ trước tiên hãy thử chuyển đổi Phối cảnh.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread ('paper.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
# phụt của 4 góc của hình ảnh gốc
điểm_A = np.float32 (,,,])
# tọa độ của 4 góc của đầu ra mong muốn # chúng tôi
sử dụng tỷ lệ của giấy A4 1: 1,41
điểm_B = np.float32 (,,,])
# sử dụng hai tập hợp hai điểm để tính ma trận chuyển đổi tiền định, M
M = cv2.getPerspectiveTransform (points_A, points_B) warped = cv2.warpPerspective (image, M, (420,594)) cv2.imshow ('warpprespective', warped) cv2.waitKey (0) cv2.destroyAllWindows ()
Biến đổi affine dễ dàng hơn sau đó biến đổi không liên kết vì chúng ta chỉ cần ba điểm để có được biến đổi. Toàn bộ quá trình diễn ra tương tự nhưng thay vì biến đổi phối cảnh, giờ đây chúng tôi có biến đổi affine và chúng tôi cũng xác định cols và hàng trong warpAffine từ hàm shape thay vì nhập thủ công.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread ('box.jpg') row, cols = image.shape cv2.imshow ('original', image) cv2.waitKey (0)
# phụt của 3 góc của hình ảnh gốc
điểm_A = np.float32 (,,])
# tọa độ của 3 góc của đầu ra mong muốn # chúng tôi
sử dụng tỷ lệ của giấy A4 1: 1,41
điểm_B = np.float32 (,,])
# sử dụng hai tập hợp hai điểm để tính toán
ma trận liên kết # chuyển đổi, M
M = cv2.getAffineTransform (points_A, points_B) warped = cv2.warpAffine (image, M, (cols, row)) cv2.imshow ('warpaffine', warped) cv2.waitKey (0) cv2.destroyAllWindows ()
8. Ứng dụng phác thảo trực tiếp
Đầu tiên, chúc mừng bản thân rằng bạn đã thực hiện được dự án nhỏ này sau khi đọc tất cả các chức năng thao tác hình ảnh ở trên. Vì vậy, trong dự án nhỏ này của Python OpenCV, chúng ta sẽ tìm hiểu một số khái niệm mới về vòng lặp và hàm. Nếu bạn đã quen với lập trình, bạn phải có một ý tưởng rộng hơn về hàm và các vòng lặp là gì. Tuy nhiên, trong python, khái niệm cơ bản về vòng lặp và các hàm vẫn giữ nguyên nhưng phương pháp xác định chúng thay đổi một chút.
Vì vậy, khi bắt đầu chương trình này, chúng ta có thể thấy một nhóm câu lệnh nhất định có tiêu đề dưới " bản phác thảo def (hình ảnh): " đây là một định nghĩa chính thức của một hàm, một nhóm câu lệnh làm việc cùng nhau cho một đầu ra nhất định.
Vì vậy, phác thảo này là một hàm, trong python hàm được định nghĩa bằng “def” và kết thúc bằng dấu “:”. Ngoài ra, các câu lệnh bắt buộc phải có bên trong hàm hoặc bạn có thể nói các câu lệnh bắt buộc để hàm hoạt động bình thường, được căn chỉnh tự động bởi hàm. Vì vậy, để thoát ra khỏi các hàm, các câu lệnh cần được căn trái hoàn toàn. Để tham khảo thêm, bạn có thể tham khảo google về cách các hàm được định nghĩa trong python.
Vì vậy, trong hàm phác thảo này, chúng tôi đã giới thiệu một số lớp xử lý hình ảnh kết hợp với nhau để tạo ra đầu ra. Đầu tiên, hình ảnh được chuyển đổi thành thang độ xám để opencv có thể xử lý nó một cách dễ dàng và sau đó một hiệu ứng mờ Gaussian được áp dụng cho hình ảnh thang màu xám để giảm nhiễu. Sau đó, các cạnh đang được trích xuất với sự trợ giúp của thuật toán phát hiện cạnh của canny sau đó một nghịch đảo nhị phân được áp dụng trên hình ảnh xác định cạnh, ở đây nghịch đảo nhị phân cũng có thể được thực hiện bằng bitwise_NOT nhưng chúng tôi đã cố tình chọn nghịch đảo nhị phân ngưỡng này vì nó cho phép tự do để thiết lập các thông số của nó cho đến khi chúng ta có được hình ảnh rõ ràng.
Cũng cần lưu ý rằng hàm lấy hình ảnh đối số và trả về hai đối số ret và mặt nạ. Trong khi ret là Boolean cho biết rằng hàm có chạy thành công hay không và mặt nạ là đầu ra cuối cùng của hàm, tức là hình ảnh được xử lý.
Sau đó, khái niệm thứ hai là vận hành webcam trong opencv được thực hiện bởi hàm cv2.VideoCapture (0) , lưu trữ hình ảnh trong một cap đối tượng mà cap có thể được đọc bằng hàm cap.read () , cũng ở đây để lưu ý rằng cap đó . read () nằm trong vòng lặp while vô hạn vì nó liên tục phải chụp ảnh, để tạo cảm giác như một video trực tiếp, trong đó tốc độ khung hình của video sẽ là tốc độ khung hình của webcam của bạn, chủ yếu nằm trong khoảng từ 24 đến 60 khung hình / giây.
cap.read () trả về ret và frame, trong đó ret là Boolean cho biết chức năng đã được chạy thành công hay chưa và khung chứa hình ảnh được chụp bởi webcam.
Dưới đây là mã OpenCV Python hoàn chỉnh để chạy Live Sketch
import cv2 import numpy as np #sketch create function def sketch (image): #convert image to grayscale img_gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) # làm sạch hình ảnh bằng cách sử dụng Gaussian Blur img_gray_blur = cv2.GaussianBlur (img_gray, (5,5), 0) # rút gọn các cạnh canny_edges = cv2.Canny (img_gray_blur, 10,70) # làm đảo ngược nhị phân hình ảnh ret, mask = cv2.threshold (canny_edges, 70,255, cv2.THRESH_BINARY_INV) trả lại mặt nạ #initialize webcam, cap là đối tượng được cung cấp bởi video capture #it chứa Boolean cho biết nó có thành công hay không (ret) #it cũng chứa các hình ảnh được thu thập từ webcam (frame) cap = cv2.VideoCapture (0) trong khi True: ret, frame = cap.read () cv2.imshow ('livesketcher', sketch (frame)) if cv2.waitKey (1) == 13: # 13 là enterkey break #release camera và đóng cửa sổ, hãy nhớ giải phóng webcam với sự trợ giúp của cap.release () cap.release () cv2.destroyAllWindows ()
Vì vậy, đây là phần cuối của Phần 2 của các thao tác hình ảnh trong Python-OpenCV. Để hiểu rõ hơn về tầm nhìn máy tính và OpenCV, hãy xem qua các bài viết trước (Bắt đầu với Python OpenCV và Thao tác hình ảnh trong Python OpenCV (Phần 1) và bạn sẽ có thể tạo ra điều gì đó thú vị với Computer Vision.