Xử lý ảnh với Python OpenCV

Với sự phát triển gần đây của ngành CNTT, thị giác máy tính [CV] đã trở thành một trong những lĩnh vực trí tuệ nhân tạo [AI] hứa hẹn nhất. Xử lý hình ảnh, như vậy, là nền tảng của CV. Trong loạt bài viết này, chúng tôi sẽ đề cập đến những điều cơ bản của nó. Khi làm theo hướng dẫn trực tuyến này, bạn sẽ tìm hiểu một số khái niệm cốt lõi về Xử lý ảnh với sự trợ giúp của thư viện OpenCV bằng ngôn ngữ lập trình Python

Gói sách điện tử này được biên soạn đặc biệt dành cho  người mới bắt đầu .
Mọi thứ từ kiến ​​thức cơ bản về Python đến việc triển khai các thuật toán Máy học để sản xuất đều ở một nơi.
Trở thành một siêu anh hùng học máy
HÔM NAY .

Trong bài viết này, chúng tôi đề cập

1. Cài đặt và thiết lập

Đối với bài viết này, bạn sẽ cần các thư viện sau. NumPy và OpenCV. Pip là cách đơn giản nhất để cài đặt các thư viện bên ngoài trong Python. Cài đặt với các bước sau

1. 1 Cài đặt OpenCV

Để cài đặt OpenCV và NumPy trong Windows, hãy sử dụng các lệnh sau

pip install numpy
pip install opencv-python

Để làm điều tương tự trong Linux, hãy sử dụng các lệnh này trong thiết bị đầu cuối

$pip3 install opencv-python
$pip3 install numpy

1. 2 Cài đặt

Để nhập OpenCV và Numpy, hãy thêm những dòng này vào tệp Python của bạn

import numpy as np
import cv2

2. Biểu diễn hình ảnh [Biểu diễn toán học của một hình ảnh]

Thế kỷ XXI là thế kỷ của số hóa. Các tín hiệu số như tín hiệu viễn thông, tín hiệu âm thanh, tín hiệu điện đang chiếm ưu thế. Hình ảnh cũng không ngoại lệ. Chuyển đổi hình ảnh sang dạng kỹ thuật số giúp xử lý hình ảnh dễ dàng hơn nhiều. Hãy đi sâu vào cách hình ảnh được thể hiện ở dạng kỹ thuật số trong bộ nhớ máy tính

2. 1 Hình ảnh dưới dạng Ma trận

Hình ảnh được biểu diễn dưới dạng ma trận hai chiều. Mỗi phần tử của ma trận đại diện cho một pixel và mỗi giá trị pixel xác định cường độ của một màu. Vị trí pixel được xác định bởi vị trí của nó trong các hàng và cột tương ứng

Có nhiều cách biểu diễn ảnh, với hai cách phổ biến nhất là. thang màu xám và RGB. Hình ảnh tỷ lệ xám là những gì chúng ta gọi là hình ảnh đen trắng và RGB là hình ảnh đa sắc. Chúng tôi sẽ đề cập sâu hơn về những khái niệm đó sau này

3. Tải hình ảnh bằng OpenCV

Trong phần này, chúng tôi sẽ tải, hiển thị và lưu hình ảnh. Tất cả các hình ảnh được sử dụng trong bài viết này có thể được tìm thấy ở đây

3. 1 Đang tải hình ảnh

Tải một hình ảnh là một nhiệm vụ rất đơn giản bằng chức năng imread của OpenCV. Imread nhận hai tham số. Cái đầu tiên là đường dẫn của ảnh chúng ta muốn tải và cái thứ hai chỉ định loại ảnh chúng ta muốn [Thang xám, Màu hoặc Không thay đổi]

Khi chúng tôi muốn tải hình ảnh màu, tham số thứ hai là 1

img_color = cv2.imread['/content/lena_color.png', 1] #1 == cv2.IMREAD_COLOR you can pass both parameters

Khi chúng tôi muốn tải ảnh thang độ xám, tham số thứ hai là 0

img_gray = cv2.imread['/content/lena_color.png', 0] #0 == cv2.IMREAD_GRAYSCALE you can pass both parameters

3. 2 Hiển thị hình ảnh

Việc hiển thị hình ảnh có thể được thực hiện với sự trợ giúp của chức năng imshow của OpenCV. Imshow cũng có hai tham số. Một chuỗi đại diện cho tên của cửa sổ trong đó hình ảnh sẽ được hiển thị và tên của biến mà hình ảnh đã được lưu trữ trong đó.

Hiển thị hình ảnh màu

#Showing color image
cv2.imshow['Colored picture', img_color]

Hiển thị ảnh thang độ xám

#Showing gray image
cv2.imshow['Gray picture', img_gray]

3. 3 Lưu ảnh

Sau khi thực hiện một số thao tác, chúng tôi muốn lưu hình ảnh đã thay đổi. May mắn thay, có một chức năng cho điều đó là tốt. Tên của hàm là imwrite và nó cũng nhận hai tham số. Đầu tiên là tên của tệp hình ảnh mới và thứ hai là tên của biến lưu trữ hình ảnh mà chúng tôi muốn lưu

#Saving a colored image
cv2.imwrite['img_color.png', img_color]
#Saving a gray image
cv2.imwrite['img_gray.png', img_gray]

4. Hình ảnh dưới dạng một mảng

Như chúng tôi đã đề cập, hình ảnh được biểu diễn dưới dạng ma trận, là cấu trúc dữ liệu hai chiều trong đó các số được sắp xếp thành hàng và cột

Ví dụ

Ma trận này có 3 hàng và 4 cột

Trong python, chúng tôi không có ma trận tích hợp, nhưng chúng tôi viết chúng dưới dạng một mảng các mảng. Số lượng mảng đại diện cho số lượng hàng và số phần tử mảng [độ dài của một mảng], đại diện cho số lượng cột

Đối với ví dụ cụ thể này, chúng tôi sẽ viết nó là

________số 8_______

Chúng ta cũng có thể sử dụng thư viện numpy để tạo ma trận mới

import numpy as np

A = np.array[[[2,-5,-11,0],
    [-9,4,6,13],
    [4,7,12,-2]]]

Hình ảnh trong OpenCV được lưu trữ dưới dạng mảng có nhiều mảng, sự khác biệt là ma trận được sử dụng để lưu trữ ảnh lớn hơn nhiều so với ma trận này

Cho đến nay, chúng tôi đã thấy rằng chúng tôi có thể hiển thị cả hình ảnh màu và thang độ xám. Vì vậy, sự khác biệt giữa chúng khi lưu trữ là gì?

4. 1 hình ảnh thang độ xám

Hình ảnh thang độ xám bao gồm một kênh hoặc chính xác hơn là một ma trận, trong đó mọi giá trị pixel biểu thị cường độ của pixel. Các giá trị pixel nằm trong khoảng từ 0-255, ở dạng biểu diễn uint8 hoặc 8 bit [mỗi pixel được biểu thị bằng 8 bit]. Càng gần 0 là các sắc thái tối hơn, trong đó 0 là màu đen, các giá trị gần 255 tự nhiên là sáng hơn, với giá trị 255 là màu trắng

Các giá trị từ 0 đến 255 đại diện cho các sắc thái của màu xám. Hình ảnh chúng tôi đã tải trước đó, khi được lưu trữ trong một ma trận, sẽ giống như thế này

$pip3 install opencv-python
$pip3 install numpy
0

Chúng ta có thể thấy rằng hình ảnh màu xám của Lena, được hiển thị trước đó, thực sự là một ma trận 512×512

4. 2 Hình ảnh RGB

RGB là viết tắt của Red-Green-Blue. Chúng tôi gọi chúng là màu cơ bản, lý do là chúng tôi chỉ có thể nhìn thấy ba màu đó. Mọi màu sắc khác mà chúng ta thấy chỉ là sự kết hợp của ba màu đó. Hình ảnh màu sử dụng đặc điểm đó của mắt người để bắt chước tất cả các màu

Về cơ bản, hình ảnh RGB là ba ma trận được ghép nối, trong đó các giá trị pixel của mỗi ma trận đại diện cho sắc thái của màu đã cho [Đỏ-Lục-Xanh lam]. Kết hợp cả ba, chúng ta có được một bức tranh màu

Đang tải một hình ảnh màu, sẽ cho chúng ta một ma trận giống như thế này

$pip3 install opencv-python
$pip3 install numpy
1

Như chúng ta có thể thấy, hình ảnh được biểu diễn dưới dạng ba ma trận được nối trong một mảng. Không giống như hình ảnh thang độ xám hiện có ba kênh và mỗi kênh đại diện cho một màu. Điều rất quan trọng cần đề cập là trong OpenCV, thứ tự của các kênh bị đảo ngược. Có nghĩa là đầu tiên là B lue, R ed đứng thứ hai và Green comes third [BGR].

5. Lập chỉ mục hình ảnh

Đôi khi chúng tôi muốn thay đổi một phần của hình ảnh hoặc chỉ một pixel. Do đó, bằng cách nào đó chúng ta cần truy cập vào các phần đó và thay đổi giá trị của chúng. Như chúng tôi đã đề cập trước đây, vị trí của mọi pixel được xác định bởi các hàng và cột trong ma trận của hình ảnh. Với suy nghĩ đó, chúng tôi sẽ chỉ ra cách lập chỉ mục hình ảnh chính xác được thực hiện

5. 1 Truy cập giá trị pixel

Lập chỉ mục hình ảnh rất giống với lập chỉ mục danh sách trong python. Sự khác biệt duy nhất là trong hình ảnh, chúng tôi có hai tọa độ. Hãy chọn một pixel từ một hình ảnh

$pip3 install opencv-python
$pip3 install numpy
2

Như bạn có thể thấy giá trị của pixel ở hàng thứ 157 và cột thứ 265 là 175. Điều rất quan trọng cần lưu ý là các hàng đến trước và các cột đến sau. Nếu muốn chọn nhiều giá trị pixel, chúng tôi cũng có thể thực hiện chính xác như cách chúng tôi thực hiện với danh sách, nhưng một lần nữa, chúng tôi có hai tọa độ

Ví dụ: hãy chọn hàng thứ tư trong hình ảnh của chúng tôi. Như chúng ta đã thấy trước đây, hình ảnh của chúng ta là một mảng có kích thước là 516×516 , vì vậy đối với một hàng, chúng ta sẽ nhận được một mảng có kích thước là 1×516.  

$pip3 install opencv-python
$pip3 install numpy
3

Chúng ta cũng có thể lấy một phần hình ảnh bằng cách sử dụng tính năng lập chỉ mục khoảng thời gian theo cả hàng và cột. Chúng tôi sẽ lấy tất cả các hàng từ 156 đến 159 và tất cả các cột từ 4 đến 7. Hãy xem những gì chúng ta nhận được

$pip3 install opencv-python
$pip3 install numpy
4

Chúng tôi đã cắt một phần của hình ảnh với loại lập chỉ mục này rất hữu ích. Ngoài ra, trong Python, chúng tôi có một thứ gọi là lập chỉ mục logic. Đôi khi chúng ta sẽ cần tất cả các pixel thỏa mãn một số điều kiện. Hãy chọn tất cả các pixel bằng 255

$pip3 install opencv-python
$pip3 install numpy
5

Như chúng ta có thể thấy ma trận logic của chúng ta chứa đầy các giá trị Sai, nghĩa là không có pixel nào thỏa mãn điều kiện của chúng ta

5. 2 Thay đổi giá trị pixel

Giờ đây, chúng ta đã biết cách truy cập các giá trị pixel,  chúng ta có thể dễ dàng thay đổi chúng. Ví dụ: chúng ta có thể gán một giá trị pixel mới, không đổi cho mọi vị trí trong ảnh hoặc chúng ta có thể thực hiện một số phép toán trên các pixel đã chọn để biến đổi chúng theo cách chúng ta cần. Đây là cách cả hai phương pháp hoạt động

$pip3 install opencv-python
$pip3 install numpy
6

5. 3 ví dụ OpenCV

Bây giờ chúng ta đã học cách thay đổi giá trị pixel, hãy xem nó thực sự trông như thế nào khi chúng ta hiển thị một hình ảnh. Đầu tiên, chúng tôi sẽ tải ảnh của mình và xem điều gì sẽ xảy ra nếu chúng tôi tăng giá trị của tất cả các pixel lên một số nhất định

$pip3 install opencv-python
$pip3 install numpy
7

Bằng cách tăng tất cả các giá trị pixel lên 100, toàn bộ hình ảnh sẽ sáng hơn. Vậy tại sao một số khu vực tối hơn trước?

Đó là bởi vì sau khi hoạt động nếu giá trị pixel vượt quá 255, Nó sẽ không vượt qua nó mà sẽ quay trở lại và bắt đầu từ dưới cùng của tỷ lệ

Vì vậy, nếu một pixel trước đây có giá trị là 240 và chúng tôi đã thêm 100, thì bây giờ pixel đó sẽ có giá trị là 85. Thông thường, chúng tôi không muốn điều này xảy ra mà chỉ giới hạn ở mức 255. Chúng ta có thể làm điều này bằng cách sử dụng chức năng thêm của OpenCV. Tham số đầu tiên chỉ định hình ảnh và tham số thứ hai xác định số lượng chúng tôi muốn thêm

$pip3 install opencv-python
$pip3 install numpy
8

Như chúng ta có thể thấy, không có màu tối hơn, điều đó có nghĩa là các giá trị vượt quá giới hạn đã bị giới hạn. Bây giờ hãy thực hiện nhiệm vụ đơn giản là tăng độ tương phản trong hình ảnh. Về cơ bản, chúng tôi muốn làm cho các pixel sáng trở nên sáng hơn và các pixel tối thậm chí còn tối hơn

$pip3 install opencv-python
$pip3 install numpy
9

Các pixel lớn hơn 150, được cho giá trị 255 và các pixel thấp hơn 100 được cho giá trị 0. Kết quả là như sau

Phần kết luận

Tùy thuộc vào tình huống, bạn sẽ sử dụng các phương pháp trực quan hóa, lập chỉ mục và gán giá trị khác nhau. Xử lý ảnh cần nhiều kinh nghiệm và kiến ​​thức. Với bài viết này, bạn vừa thực hiện bước đầu tiên trong việc học xử lý ảnh và thị giác máy tính. Chúng tôi khuyến khích bạn tiếp tục theo dõi loạt bài của chúng tôi. Chúng ta sẽ đề cập nhiều hơn về các khái niệm cơ bản trong OpenCV và Xử lý hình ảnh. Sau khi bạn chinh phục những điều cơ bản, chúng ta sẽ thực hiện một số dự án và các khái niệm nâng cao hơn

tác giả

Stefan Nidzovic

Tác giả tại Giải mã Rubik

Stefan Nidzovic là sinh viên Khoa Khoa học Kỹ thuật, Đại học Novi Sad. Chính xác hơn, khoa kỹ thuật y sinh, tập trung chủ yếu vào việc áp dụng kiến ​​thức về thị giác máy tính và học máy trong y học. Anh ấy cũng là thành viên của “Trung tâm Kỹ thuật Sáng tạo”, nơi anh ấy làm việc trong nhiều dự án khác nhau, chủ yếu là về thị giác máy tính

Milos Marinkovic

Tác giả tại Giải mã Rubik

Miloš Marinković là sinh viên ngành Kỹ thuật Y sinh, Khoa Khoa học Kỹ thuật, Đại học Novi Sad. Trước khi đăng ký vào trường đại học, Miloš đã tốt nghiệp trường thể dục “Jovan Jovanović Zmaj” vào năm 2019 ở Novi Sad. Hiện tại anh là thành viên của “Creative Engineering Center”, nơi anh tham gia vào một vài dự án xử lý ảnh và điện tử nhúng. Ngoài ra, Miloš làm thực tập sinh tại Viện BioSense ở Novi Sad, trong các dự án bao gồm tin sinh học, phân tích trình tự DNA và học máy. Khi còn trẻ, anh ấy là thành viên của đội tuyển quốc gia judo Serbia và anh ấy giữ đai đen môn judo

OpenCV có thể được sử dụng để xử lý hình ảnh không?

OpenCV là thư viện [gói] mã nguồn mở, chỉ dành cho CPU được xây dựng sẵn, được sử dụng rộng rãi cho các ứng dụng xử lý hình ảnh, máy học và thị giác máy tính. It supports a good variety of programming languages including Python.

Tôi có thể sử dụng Python để xử lý ảnh không?

Python là một trong những ngôn ngữ lập trình được sử dụng rộng rãi cho mục đích này . Các thư viện và công cụ tuyệt vời của nó giúp đạt được nhiệm vụ xử lý hình ảnh rất hiệu quả.

Thuật toán nào được sử dụng trong OpenCV để xử lý ảnh?

OpenCV cung cấp một mô-đun có tên ml có nhiều thuật toán học máy được tích hợp trong đó. Một số thuật toán bao gồm Bayes Classifier, K-Nearest Neighbors, Support Vector Machines, Decision Trees, Neural Networks , v.v.

OpenCV nhanh hơn Python hay C++?

Thời gian chạy chậm hơn. So với C++, các chương trình của bạn trong Python thường sẽ chạy chậm hơn. Để tăng thêm sức mạnh, bạn có thể sử dụng GPU [ sử dụng CUDA hoặc OpenCL ] trong OpenCV [C++] và có mã chạy nhanh hơn 10 lần so với triển khai Python .

Chủ Đề