Python: Phân đoạn hình ảnh bằng không gian màu trong OpenCV + Python

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Mục lục


Đó có thể là kỷ nguyên của học sâu và dữ liệu lớn, nơi các thuật toán phức tạp phân tích hình ảnh bằng cách hiển thị hàng triệu hình ảnh, nhưng không gian màu vẫn hữu ích một cách đáng ngạc nhiên cho việc phân tích hình ảnh. Các phương pháp đơn giản vẫn có thể mạnh mẽ.

Trong bài viết này, bạn sẽ học cách đơn giản phân đoạn một đối tượng từ một hình ảnh dựa trên màu sắc trong Python bằng OpenCV. Một thư viện thị giác máy tính phổ biến được viết bằng C/C++ với các liên kết cho Python, OpenCV cung cấp các cách dễ dàng để thao tác các không gian màu.

Mặc dù bạn không cần phải quen thuộc với OpenCV hoặc các gói trợ giúp khác được sử dụng trong bài viết này, nhưng có thể giả định rằng bạn có ít nhất hiểu biết cơ bản về lập trình với Python.

Phần thưởng miễn phí: Nhấp vào đây để nhận Hướng dẫn nhỏ về phát hiện khuôn mặt với Python & ví dụ OpenCV hiển thị cho bạn các ví dụ mã thực tế về các kỹ thuật thị giác máy tính Python trong thế giới thực.

Không gian màu là gì?

Trong không gian màu phổ biến nhất, RGB (Red Green Blue), các màu được biểu thị dưới dạng các thành phần màu đỏ, xanh lá cây và xanh lam của chúng. Theo thuật ngữ kỹ thuật hơn, RGB mô tả một màu như một bộ ba thành phần. Mỗi thành phần có thể nhận một giá trị từ 0 đến 255, trong đó tuple (0, 0, 0) đại diện cho màu đen và (255, 255, 255) đại diện cho màu trắng.

RGB được coi là không gian màu “phụ gia” và màu sắc có thể được tưởng tượng như được tạo ra từ việc chiếu một lượng ánh sáng đỏ, lam và lục lên nền đen.

Dưới đây là một số ví dụ khác về màu sắc trong RGB:

Màu sắc Giá trị RGB
Màu đỏ 255, 0, 0
Quả cam 255, 128, 0
Hồng 255, 153, 255

RGB là một trong năm mô hình không gian màu chính, mỗi mô hình có nhiều nhánh. Có rất nhiều không gian màu bởi vì các không gian màu khác nhau hữu ích cho các mục đích khác nhau.

Trong thế giới in ấn, CMYK rất hữu ích vì nó mô tả sự kết hợp màu sắc cần thiết để tạo ra màu từ nền trắng. Trong khi bộ 0 trong RGB là màu đen, thì trong CMYK bộ 0 là màu trắng. Máy in của chúng ta chứa các ống mực có màu lục lam, đỏ tươi, vàng và đen.

Trong một số loại lĩnh vực y tế, các lam kính gắn với các mẫu mô nhuộm được quét và lưu dưới dạng hình ảnh. Chúng có thể được phân tích trong không gian HED, đại diện cho độ bão hòa của các loại vết - hematoxylin, eosin và DAB - được áp dụng cho mô ban đầu.

HSV và HSL là các mô tả về màu sắc, độ bão hòa và độ sáng/độ chói, đặc biệt hữu ích để xác định độ tương phản trong hình ảnh. Những không gian màu này thường được sử dụng trong các công cụ chọn màu trong phần mềm và thiết kế web.

Trong thực tế, màu sắc là một hiện tượng liên tục, có nghĩa là có vô số màu sắc. Tuy nhiên, không gian màu thể hiện màu sắc thông qua các cấu trúc rời rạc (một số cố định của các giá trị số nguyên của một số nguyên), điều này có thể chấp nhận được vì mắt người và nhận thức cũng bị hạn chế. Không gian màu hoàn toàn có thể đại diện cho tất cả các màu mà chúng ta có thể phân biệt được.

Bây giờ chúng ta đã hiểu khái niệm về không gian màu, chúng ta có thể tiếp tục sử dụng chúng trong OpenCV.

Phân đoạn đơn giản bằng cách sử dụng không gian màu

Để chứng minh kỹ thuật phân đoạn không gian màu, chúng tôi đã cung cấp một tập dữ liệu nhỏ về hình ảnh cá hề (clownfish) trong kho tài liệu Python tại đây để bạn tải xuống và chơi cùng. Cá hề có thể dễ dàng nhận biết bởi màu cam sáng của chúng, vì vậy chúng là một ứng cử viên tốt để phân khúc. Hãy xem chúng ta có thể tìm thấy Nemo trong một hình ảnh tốt như thế nào.

Các gói Python chính mà bạn cần tuân theo là NumPy, gói quan trọng nhất dành cho tính toán khoa học bằng Python, Matplotlib, một thư viện vẽ đồ thị và tất nhiên là OpenCV. Bài viết này sử dụng OpenCV 3.2.0, NumPy 1.12.1 và Matplotlib 2.0.2. Các phiên bản hơi khác nhau sẽ không tạo ra sự khác biệt đáng kể về mặt theo dõi và nắm bắt các khái niệm.

Nếu bạn chưa quen với NumPy hoặc Matplotlib, bạn có thể đọc về chúng trong hướng dẫn chính thức về NumPy và bài viết xuất sắc của Brad Solomon trên Matplotlib.

Không gian màu và đọc ảnh trong OpenCV

Đầu tiên, bạn sẽ cần thiết lập môi trường của mình. Bài viết này sẽ giả sử bạn đã cài đặt Python 3.x trên hệ thống của mình. Lưu ý rằng mặc dù phiên bản hiện tại của OpenCV là 3.x, nhưng tên của gói cần nhập vẫn là cv2:

>>> import cv2

Nếu trước đó bạn chưa cài đặt OpenCV trên máy tính của mình, quá trình nhập sẽ không thành công cho đến khi bạn thực hiện điều đó trước. Bạn có thể tìm thấy hướng dẫn thân thiện với người dùng để cài đặt trên các hệ điều hành khác nhau tại đây, cũng như hướng dẫn cài đặt riêng của OpenCV. Khi bạn đã import OpenCV thành công, bạn có thể xem tất cả các chuyển đổi không gian màu mà OpenCV cung cấp và bạn có thể lưu tất cả chúng vào một biến:

>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]

Danh sách và số lượng cờ có thể thay đổi một chút tùy thuộc vào phiên bản OpenCV của bạn, nhưng vẫn sẽ có rất nhiều! Xem bạn có bao nhiêu cờ:

>>> len(flags)
258
>>> flags[40]
'COLOR_BGR2RGB'

Các ký tự đầu tiên sau COLOR_ biểu thị không gian màu gốc và các ký tự sau 2 là không gian màu đích. Cờ này biểu thị sự chuyển đổi từ BGR (Xanh lam, Xanh lục, Đỏ) sang RGB. Như bạn có thể thấy, hai không gian màu rất giống nhau, chỉ có kênh đầu tiên và kênh cuối cùng được hoán đổi.

Bạn sẽ cần matplotlib.pyplot để xem hình ảnh và NumPy để thao tác hình ảnh. Nếu bạn chưa cài đặt Matplotlib hoặc NumPy, bạn cần pip3 install matplotlib và pip3 install numpy trước khi import:

>>> import matplotlib.pyplot as plt
>>> import numpy as np

Bây giờ bạn đã sẵn sàng để tải và kiểm tra một hình ảnh. Lưu ý rằng nếu bạn đang làm việc từ dòng lệnh hoặc thiết bị đầu cuối, hình ảnh của bạn sẽ xuất hiện trong cửa sổ bật lên. Nếu bạn đang làm việc trong sổ ghi chép Jupyter hoặc thứ gì đó tương tự, chúng sẽ đơn giản được hiển thị như bên dưới. Bất kể thiết lập của bạn là gì, bạn sẽ thấy hình ảnh được tạo bởi lệnh show():

>>> nemo = cv2.imread('./images/nemo0.jpg')
>>> plt.imshow(nemo)
>>> plt.show()

OpenCV sử dụng BGR theo mặc định

Đây là Nemo… hay Dory? Bạn sẽ nhận thấy rằng có vẻ như các kênh màu xanh và màu đỏ đã bị trộn lẫn. Trên thực tế, OpenCV theo mặc định đọc hình ảnh ở định dạng BGR. Bạn có thể sử dụng cvtColor(image, flag) và cờ mà chúng ta đã xem xét ở trên để sửa lỗi này:

>>> nemo = cv2.cvtColor(nemo, cv2.COLOR_BGR2RGB)
>>> plt.imshow(nemo)
>>> plt.show()

BGR sang RGB

Bây giờ Nemo trông giống chính mình hơn nhiều.

Hình dung Nemo trong Không gian màu RGB

HSV là một lựa chọn tốt về không gian màu để phân đoạn theo màu, nhưng để biết lý do tại sao, chúng ta hãy so sánh hình ảnh trong cả không gian màu RGB và HSV bằng cách trực quan hóa sự phân bố màu của các pixel của nó. Biểu đồ 3D cho thấy điều này khá độc đáo, với mỗi trục đại diện cho một trong các kênh trong không gian màu. Nếu bạn muốn biết cách tạo đồ thị (plot) 3D, hãy xem phần sau:

Cách tạo đồ thị phân tán 3D có màu

Để tạo đồ thị bạn sẽ cần một số thư viện Matplotlib:

>>> from mpl_toolkits.mplot3d import Axes3D
>>> from matplotlib import cm
>>> from matplotlib import colors

Những thư viện này sẽ cung cấp các chức năng ta cần cho việc tạo đồ thị. Ta muốn đặt từng pixel trong vị trí của nó dựa trên những thành phần và màu sắc của nó. split() của OpenCV là rất tiện dụng; nó chia một ảnh thành các kênh thành phần của nó. Một số dòng lệnh dưới đây sẽ chia ảnh và cài đặt đồ thị 3D:

>>> r, g, b = cv2.split(nemo)
>>> fig = plt.figure()
>>> axis = fig.add_subplot(1, 1, 1, projection="3d")

Đến đây thì bạn đã set up xong đồ thị, giờ bạn cần set up màu cho pixel. Để tạo màu cho pixel sao cho đúng thì cần phải vẽ lại một chút chuẩn hóa theo yêu cầu. Trông có vẻ như lộn xộn, nhưng bạn cần các màu tương ứng cho mỗi pixel trong ảnh được làm phẳng thành một danh sách và chuẩn hóa, vì vậy chúng có thể được truyền đến tham số facecolors của phương thức Matplotlib scatter().

Chuẩn hóa có nghĩa là đơn giản hóa giải màu từ 0-255 thành 0-1 theo yêu cầu đối với tham số facecolors. Cuối cùng, facecolors muốn một list mà không phải là một mảng NumPy:

>>> pixel_colors = nemo.reshape((np.shape(nemo)[0]*np.shape(nemo)[1], 3))
>>> norm = colors.Normalize(vmin=-1.,vmax=1.)
>>> norm.autoscale(pixel_colors)
>>> pixel_colors = norm(pixel_colors).tolist()

Đến đây thì tất cả các thành phần đều đã thỏa mãn và cho việc lập biểu đồ: Vị trí điểm ảnh cho từng tọa độ và màu phù hợp theo định dạng facecolors mong muốn. Ta có thể xây dựng biểu đồ và xem nó:

>>> axis.scatter(r.flatten(), g.flatten(), b.flatten(), facecolors=pixel_colors, marker=".")
>>> axis.set_xlabel("Red")
>>> axis.set_ylabel("Green")
>>> axis.set_zlabel("Blue")
>>> plt.show()

Đây là biểu đồ tán xạ màu cho hình ảnh Nemo trong RGB:

Biểu đồ phân tán 3D của hình ảnh trong RGB

Từ biểu đồ này, bạn có thể thấy rằng các phần màu cam của hình ảnh trải dài trên gần như toàn bộ dải giá trị đỏ, lục và lam. Vì các phần của Nemo trải dài trên toàn bộ biểu đồ, cho nên việc phân đoạn Nemo ra trong không gian RGB dựa trên các dải giá trị RGB sẽ không dễ dàng.

Hình dung Nemo trong Không gian màu HSV

Chúng ta đã thấy Nemo trong không gian RGB, vì vậy bây giờ hãy xem anh ấy trong không gian HSV và so sánh.

Như đã đề cập ngắn gọn ở trên, HSV là viết tắt của Hue, Saturation và Value (hoặc độ sáng), và là một không gian màu hình trụ. Màu sắc, hoặc sắc độ, được mô hình hóa dưới dạng một kích thước góc quay quanh trục trung tâm, trục tung, đại diện cho kênh giá trị. Các giá trị đi từ tối (0 ở dưới cùng) đến sáng ở trên cùng. Trục thứ ba, độ bão hòa, xác định các sắc độ từ ít bão hòa nhất, ở trục tung, đến bão hòa nhất ở xa trung tâm nhất:

Hình trụ không gian màu HSV
Hình ảnh: Wikipedia

Để chuyển đổi hình ảnh từ RGB sang HSV, bạn có thể sử dụng cvtColor():

>>> hsv_nemo = cv2.cvtColor(nemo, cv2.COLOR_RGB2HSV)

Bây giờ hsv_nemo sẽ lưu trữ đại diện của Nemo trong HSV. Sử dụng kỹ thuật tương tự như trên, chúng ta có thể xem một biểu đồ của hình ảnh trong HSV, được tạo bởi phần dưới đây:

Tạo Biểu đồ tán xạ 3D có màu cho hình ảnh trong HSV

Đoạn code dưới đây cho thấy ảnh HSV tương tự như ảnh RGB. Lưu ý rằng bạn sử dụng biến pixel_colors tương tự cho việc tạo màu các pixel, vì Matplotlib mong muốn các giá trị theo RGB:

>>> h, s, v = cv2.split(hsv_nemo)
>>> fig = plt.figure()
>>> axis = fig.add_subplot(1, 1, 1, projection="3d")

>>> axis.scatter(h.flatten(), s.flatten(), v.flatten(), facecolors=pixel_colors, marker=".")
>>> axis.set_xlabel("Hue")
>>> axis.set_ylabel("Saturation")
>>> axis.set_zlabel("Value")
>>> plt.show()

Biểu đồ phân tán 3D của hình ảnh theo HSV

Trong không gian HSV, màu cam của Nemo được bản địa hóa nhiều hơn và có thể phân biệt bằng mắt. Độ bão hòa và giá trị của màu cam khác nhau, nhưng chúng chủ yếu nằm trong một dải màu nhỏ dọc theo trục màu. Đây là điểm mấu chốt có thể được tận dụng để phân khúc.

Chọn ra một dải màu

Ta cần xác định Nemo chỉ dựa trên một loạt các màu cam. Bạn có thể chọn dải màu (range) bằng cách nhắm mắt vào biểu đồ ở trên hoặc sử dụng ứng dụng chọn màu trực tuyến chẳng hạn như công cụ RGB sang HSV này. Các mẫu được chọn ở đây là màu cam nhạt và màu cam đậm khá gần với màu đỏ:

>>> light_orange = (1, 190, 200)
>>> dark_orange = (18, 255, 255)

Nếu bạn muốn sử dụng Python để hiển thị các màu bạn đã chọn, hãy xem phần sau đây:

Hiển thị màu HSV đã chọn

Một cách đơn giản để hiển thị màu trong Python là tạo các ảnh vuông nhỏ có màu mong muốn và vẽ chúng trong Matplotlib. Matplotlib chỉ dịch các màu RGB, nhưng các hàm chuyển đổi tiện dụng được cung cấp cho các không gian màu lớn cho nên ta có thể vẽ các ảnh trong các không gian màu khác nhau:

>>> from matplotlib.colors import hsv_to_rgb

Khi đó ta sẽ tạo các ô vuông nhỏ kích thước 10x10x3, điền chúng với màu sắc tương ứng. Ta có thể sử dụng NumPy để dễ dàng tô màu các ô vuông:

>>> lo_square = np.full((10, 10, 3), light_orange, dtype=np.uint8) / 255.0
>>> do_square = np.full((10, 10, 3), dark_orange, dtype=np.uint8) / 255.0

Cuối cùng, ta có thể vẽ chúng lại với nhau bằng cách chuyển đổi chúng thành RGB để xem:

>>> plt.subplot(1, 2, 1)
>>> plt.imshow(hsv_to_rgb(do_square))
>>> plt.subplot(1, 2, 2)
>>> plt.imshow(hsv_to_rgb(lo_square))
>>> plt.show()

Kết quả là ta sẽ tạo ra những hình ảnh chứa đầy các màu đã chọn:

Phạm vi màu cam nhạt và đậm

Khi bạn có được một dải màu phù hợp, bạn có thể sử dụng cv2.inRange() để cố gắng tái hiện đúng Nemo. inRange() nhận ba tham số: hình ảnh, dải thấp hơn và dải cao hơn. Nó trả về một mặt nạ nhị phân (một ndarray trong số 1s và 0s) bằng kích thước của hình ảnh trong đó các giá trị của các giá trị 1 chỉ ra trong dải màu và các giá trị 0 chỉ ra các giá trị bên ngoài dải:

>>> mask = cv2.inRange(hsv_nemo, light_orange, dark_orange)

Để áp đặt mặt nạ lên trên hình ảnh gốc, bạn có thể sử dụng cv2.bitwise_and(), điều này sẽ giữ mọi pixel trong hình ảnh đã cho nếu giá trị tương ứng trong mặt nạ là 1:

>>> result = cv2.bitwise_and(nemo, nemo, mask=mask)

Để xem chính xác điều đó đã làm gì, hãy xem cả mặt nạ và hình ảnh gốc với mặt nạ ở trên:

>>> plt.subplot(1, 2, 1)
>>> plt.imshow(mask, cmap="gray")
>>> plt.subplot(1, 2, 2)
>>> plt.imshow(result)
>>> plt.show()

Mặt nạ và bản gốc với mặt nạ áp đặt

Như vậy ta đã thực hiện được việc quan trọng đó là chụp những vị trí có màu cam của con cá. Vấn đề duy nhất là Nemo cũng có các sọc trắng… May mắn thay, việc thêm một mặt nạ thứ hai để tìm kiếm phần màu trắng rất giống với những gì bạn đã làm với những màu cam:

>>> light_white = (0, 0, 200)
>>> dark_white = (145, 60, 255)

Khi bạn đã chỉ định một dải màu, bạn có thể xem các màu bạn đã chọn:

Dải màu trắng

Hiển thị màu trắng

Để hiển thị màu trắng thì ta có thể sử dụng phương pháp tương tự như chúng ta đã làm với màu cam:

>>> lw_square = np.full((10, 10, 3), light_white, dtype=np.uint8) / 255.0
>>> dw_square = np.full((10, 10, 3), dark_white, dtype=np.uint8) / 255.0

>>> plt.subplot(1, 2, 1)
>>> plt.imshow(hsv_to_rgb(lw_square))
>>> plt.subplot(1, 2, 2)
>>> plt.imshow(hsv_to_rgb(dw_square))
>>> plt.show()

Dải m mà ta đã chọn ở đây là màu trắng pha xanh, bởi vì màu trắng có những mảng màu xanh lam trong bóng tối. Hãy tạo một mặt nạ thứ hai và xem liệu nó có bắt được các sọc của Nemo hay không. Bạn có thể tạo mặt nạ thứ hai giống như cách bạn đã làm lần đầu tiên:

>>> mask_white = cv2.inRange(hsv_nemo, light_white, dark_white)
>>> result_white = cv2.bitwise_and(nemo, nemo, mask=mask_white)

>>> plt.subplot(1, 2, 1)
>>> plt.imshow(mask_white, cmap="gray")
>>> plt.subplot(1, 2, 2)
>>> plt.imshow(result_white)
>>> plt.show()

Mặt nạ và bản gốc cho sọc trắng

Kết quả bạn sẽ thấy là không tệ. Và bây giờ bạn có thể kết hợp các mặt nạ. Việc thêm hai mặt nạ với nhau sẽ tạo ra các giá trị 1 ở bất kỳ nơi nào có màu cam hoặc trắng, đó chính xác là những gì cần thiết. Hãy thêm các mặt nạ lại với nhau và vẽ biểu đồ kết quả:

>>> final_mask = mask + mask_white

>>> final_result = cv2.bitwise_and(nemo, nemo, mask=final_mask)
>>> plt.subplot(1, 2, 1)
>>> plt.imshow(final_mask, cmap="gray")
>>> plt.subplot(1, 2, 2)
>>> plt.imshow(final_result)
>>> plt.show()

Mặt nạ kết hợp cuối cùng và mặt nạ ban đầu

Về cơ bản, bạn có một phân đoạn thô của Nemo trong không gian màu HSV. Bạn sẽ nhận thấy có một vài pixel đi lạc dọc theo đường viền phân đoạn và nếu muốn, bạn có thể sử dụng tính năng làm mờ Gaussian để làm gọn các phát hiện sai nhỏ.

Làm mờ Gaussian là một bộ lọc hình ảnh sử dụng một loại chức năng gọi là Gaussian để biến đổi từng pixel trong hình ảnh. Nó có kết quả là làm mịn ảnh và giảm chi tiết. Đây là những gì áp dụng làm mờ trông như thế nào cho hình ảnh của chúng ta:

>>> blur = cv2.GaussianBlur(final_result, (7, 7), 0)
>>> plt.imshow(blur)
>>> plt.show()

Nemo được phân đoạn cuối với độ mờ

Phân đoạn này có thể tạo tổng quát hóa cho những chú cá Nemo khác không?

Chỉ cho vui thôi, hãy xem kỹ thuật phân đoạn này tổng quát tốt như thế nào đối với các hình ảnh Nemo khác. Trong kho lưu trữ, có tuyển chọn sáu hình ảnh về Nemo từ Google, được cấp phép sử dụng công khai. Các hình ảnh nằm trong thư mục con và được lập chỉ mục theo dạng nemoi.jpg, trong đó i là chỉ mục từ 0-5.

Đầu tiên, hãy tải tất cả các phần của Nemo vào một danh sách:

path = "./images/nemo"

nemos_friends = []
for i in range(6):
   friend = cv2.cvtColor(cv2.imread(path + str(i) + ".jpg"), cv2.COLOR_BGR2RGB)
   nemos_friends.append(friend)

Bạn có thể kết hợp tất cả mã được sử dụng ở trên để phân đoạn một con cá thành một hàm sẽ lấy một hình ảnh làm đầu vào và trả về hình ảnh đã phân đoạn. Hãy xem hàm segment_fish() dưới đây để xem nó trông như thế nào:

def segment_fish(image):
    ''' Cố gắng phân đoạn Nemo ngoài phạm vi của ảnh được cung cấp '''

    # Chuyển ảnh thành HSV
    hsv_image = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

    # Thiết lập dải màu cam
    light_orange = (1, 190, 200)
    dark_orange = (18, 255, 255)

    # Dùng mặt nạ cam 
    mask = cv2.inRange(hsv_image, light_orange, dark_orange)

    # Thiết lập dải màu trắng
    light_white = (0, 0, 200)
    dark_white = (145, 60, 255)

    # Dùng mặt nạ trắng
    mask_white = cv2.inRange(hsv_image, light_white, dark_white)

    # Kết hợp hai mặt nạ
    final_mask = mask + mask_white
    result = cv2.bitwise_and(image, image, mask=final_mask)

    # Xóa phần đoạn sử dụng tính năng làm mờ
    blur = cv2.GaussianBlur(result, (7, 7), 0)
    return blur

Với hàm hữu ích này thì ta có thể phân đoạn tất cả các con cá:

results = [segment_fish(friend) for friend in nemos_friends]

Ta hãy xem tất cả các kết quả bằng cách vẽ chúng theo một vòng lặp:

for i in range(1, 6):
    plt.subplot(1, 2, 1)
    plt.imshow(nemos_friends[i])
    plt.subplot(1, 2, 2)
    plt.imshow(results[i])
    plt.show()

Bạn của Nemo 1

Nemo ở tiền cảnh có màu da cam đậm hơn dải màu của chúng ta.

Bạn của Nemo 2

Phần nửa dưới bị bóng của cháu trai của Nemo bị loại trừ hoàn toàn, nhưng các mảnh của hải quỳ màu tím ở nền trông thật khủng khiếp giống như những sọc nhuốm màu xanh lam của Nemo…

Bạn của Nemo 3

4 người bạn của Nemo

Bạn của Nemo 5

Nhìn chung, phương pháp phân đoạn đơn giản này đã định vị thành công phần lớn các chú cá Nemo. Tuy nhiên, rõ ràng là việc phân đoạn một chú cá Nemo với ánh sáng và nền cụ thể có thể không nhất thiết khái quát tốt cho việc phân đoạn tất cả các chú cá Nemo.

Kết luận

Trong bài hướng dẫn này, bạn đã thấy một số không gian màu khác nhau là gì, cách một hình ảnh được phân phối trên các không gian màu RGB và HSV cũng như cách sử dụng OpenCV để chuyển đổi giữa các không gian màu và phân đoạn ra các dải màu.

Nhìn chung, bạn đã học được cách hiểu cơ bản về cách không gian màu trong OpenCV có thể được sử dụng để thực hiện phân đoạn đối tượng trong hình ảnh và hy vọng rằng nó cũng có thể thực hiện các tác vụ khác. Trong trường hợp ánh sáng và nền được kiểm soát, chẳng hạn như trong cài đặt thử nghiệm hoặc với tập dữ liệu đồng nhất hơn, thì kỹ thuật phân đoạn này đơn giản, nhanh chóng và đáng tin cậy.

» Tiếp: Một kỹ thuật chuẩn đoán bệnh viêm da cơ địa sử dụng mạng học sâu
« Trước: Nhận diện khuôn mặt trên Webcam bằng Python
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!