Hướng dẫn cho người mới bắt đầu xử lý hình ảnh với OpenCV và Python

Nút nguồn: 1074439

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu

Giới thiệu

Có thể có rất nhiều thông tin ẩn bên trong một hình ảnh và chúng ta có thể giải thích nó theo nhiều cách và quan điểm khác nhau. Vì vậy, một hình ảnh là gì và làm thế nào để xử lý một hình ảnh? Nói một cách dễ hiểu, chúng ta có thể nói rằng một hình ảnh là một hình ảnh đại diện cho một thứ gì đó và nó có thể được xử lý dễ dàng bằng cách sử dụng thị giác máy tính (từ góc độ máy học). Còn video thì sao? Video có thể được mô tả như một bản ghi lại một tập hợp các hình ảnh chuyển động hoặc các khung hình liên tục. Nhưng chúng ta có thể xử lý video bằng cách sử dụng thị giác máy tính trong một blog khác! 🙂

Một số bạn có thể đã biết về Computer Vision và có thể bỏ qua đoạn này, nhưng đối với những người chưa biết về nó, Computer Vision, chủ yếu được biết đến dưới dạng viết tắt là 'CV', có thể được coi là một lĩnh vực trong Trí tuệ nhân tạo trích xuất thông tin hữu ích hầu hết các lĩnh vực trong kỷ nguyên hiện đại này bao gồm lĩnh vực y tế, ô tô, sản xuất, nông nghiệp, v.v.

Xử lý ảnh với OpenCV | tầm nhìn máy tính

Hình ảnh 1

Là một con người, hiện đang đọc bài đăng này, bạn sẽ có thể phân biệt giữa những thứ hoặc yếu tố có trong một hình ảnh. Nhưng, những gì về máy móc? Họ có thể nhìn thấy và suy nghĩ để phân biệt nó không? KHÔNG? sau đó hãy để máy của bạn làm điều đó.

Trong blog này, bạn sẽ tự làm quen với những điều cơ bản về thị giác máy tính bằng cách sử dụng python.

Tôi tin rằng bạn đã cài đặt Python Shell / Jupyter Notebook / PyCharm hoặc Visual Studio Code (tên một số) để lập trình bằng python. Hãy cài đặt gói được sử dụng rộng rãi (OpenCV) để bắt đầu và chúng ta sẽ chạy mã trong mỗi ô trong một Máy tính xách tay Jupyter.

Cài đặt gói OpenCV để xử lý trước hình ảnh

OpenCV là một thư viện mã nguồn mở chỉ dành cho CPU (gói) được xây dựng trước, được sử dụng rộng rãi cho các ứng dụng thị giác máy tính, học máy và xử lý hình ảnh. Nó hỗ trợ nhiều ngôn ngữ lập trình bao gồm cả Python.

Cài đặt gói OpenCV bằng:

pip cài đặt opencv-python

OR

pip cài đặt opencv-Contrib-python

Chạy bất kỳ lệnh nào trong số này trên thiết bị đầu cuối của bạn hoặc nếu bạn đang sử dụng Anaconda Navigator - Jupyter Notebook, bạn có thể thay đổi “pip” bằng lệnh “conda” và cài đặt tương tự.

Nhập gói

Một gói trong Python là gì? Một gói trong Python là một tập hợp các mô-đun có chứa các tập lệnh được viết sẵn. Các gói này giúp chúng tôi nhập toàn bộ hoặc thậm chí riêng lẻ các mô-đun. Chúng tôi có thể nhập gói bằng cách gọi mô-đun “cv2” như sau:

nhập cv2

Đọc một hình ảnh

Hình ảnh kỹ thuật số có thể được phân loại thành; ảnh màu, ảnh thang xám, ảnh nhị phân và ảnh đa quang. Hình ảnh màu bao gồm thông tin màu cho mỗi pixel. Hình ảnh có sắc thái xám làm màu duy nhất của chúng là hình ảnh thang độ xám trong khi hình ảnh nhị phân có chính xác hai màu, chủ yếu là các pixel đen và trắng. Hình ảnh đa quang là hình ảnh thu thập dữ liệu hình ảnh khác nhau trên phổ điện từ trong một số bước sóng cụ thể.

Hãy quay lại phần mã hóa và đọc một hình ảnh, ví dụ như hình ảnh được hiển thị bên dưới:

đọc hình ảnh | Xử lý hình ảnh với OpenCV

Đây là hình ảnh của một mandrill. Tôi hiện đang đọc hình ảnh từ thư mục cục bộ của mình.

# cv2.imread (path_to_image_with_file_extension, flag)

Mã sử ​​dụng trông như thế này:

img = cv2.imread ("mandrill.jpg", 1)

Ở đây chúng tôi đang sử dụng phương thức “imread” của gói cv2 để đọc hình ảnh và tham số đầu tiên tương ứng với đường dẫn của hình ảnh với tên tệp và phần mở rộng của nó và tham số thứ hai là cờ mà bạn có thể đặt để chỉ đường, làm thế nào để đọc trong hình ảnh. Nếu muốn, bạn có thể thay thế đường dẫn tuyệt đối đến hình ảnh ở đây và thử đọc nó từ máy tính cục bộ của bạn hoặc thậm chí từ internet! Nếu hình ảnh có trong thư mục làm việc hiện tại của bạn, bạn chỉ cần chỉ định tên hình ảnh với kiểu mở rộng của nó.

Đối với tham số thứ hai có liên quan, nếu bạn muốn đọc nó dưới dạng hình ảnh thang độ xám, bạn có thể chỉ định tham số thành 0, -1 để đọc hình ảnh như không thay đổi (đọc hình ảnh dưới dạng kênh alpha hoặc trong suốt nếu có) và theo mặc định, nó là 1, dưới dạng hình ảnh màu. Bạn cũng có thể thử các thông số khác từ liên kết này:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

trong ImreadModes.

Thuộc tính của một hình ảnh

Hình dạng:

Mọi hình ảnh đều có một hình dạng. Chiều dài của ranh giới được hiển thị bởi hình ảnh có thể được gọi là hình dạng, tức là chiều cao và chiều rộng. Bây giờ bạn đã biết cách đọc một hình ảnh, vậy chúng ta kiểm tra hình dạng của hình ảnh như thế nào?

in (img.shape)

là cách cơ bản để in hình dạng của hình ảnh, nhưng chúng tôi có thể trích xuất hình dạng bằng cách sử dụng:

h, w, c = img.shape print ("Kích thước của hình ảnh là: nnHeight:", h, "pixelnWidth:", w, "pixelnSố kênh:", c)

để hiểu rõ hơn.

Đối với chế độ màu và không thay đổi, nó sẽ trả về 3 giá trị bao gồm chiều cao, chiều rộng và số kênh có trong hình ảnh. Nếu bạn đã sử dụng chế độ thang độ xám, hình dạng sẽ là 2, sẽ trả về chiều cao và chiều rộng của hình ảnh, nhưng sau đó bạn chỉ cần sử dụng các biến h và w (loại trừ sử dụng “c”), nếu không bạn có thể nhận được lỗi giá trị cho biết "không đủ giá trị để giải nén (dự kiến ​​3, có 2)".

Kiểu:

Chúng ta có thể biết loại hình ảnh bằng phương pháp “type”. Sử dụng phương pháp này giúp chúng ta biết dữ liệu hình ảnh được biểu diễn như thế nào. Chạy mã như sau:

in (gõ (img))

Kết quả có thể như thế này:

như loại hình ảnh. Nó là vật chứa nhiều chiều các mặt hàng cùng loại và cùng kích thước. Bạn có thể tham khảo thêm về mảng N chiều tại link sau:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

Kiểu dữ liệu của hình ảnh bạn vừa đọc:

Vì hình ảnh là một mảng N chiều, chúng ta có thể kiểm tra kiểu dữ liệu của hình ảnh:

in (img.dtype)

Giá trị pixel hình ảnh:

Chúng ta có thể coi một hình ảnh là một tập hợp các mẫu nhỏ. Những mẫu này được gọi là pixel. Để hiểu rõ hơn, hãy thử phóng to hình ảnh nhiều nhất có thể. Chúng ta có thể thấy giống nhau được chia thành các ô vuông khác nhau. Đây là những pixel và khi chúng được kết hợp với nhau, chúng sẽ tạo thành một hình ảnh.

Một trong những cách đơn giản để biểu diễn một hình ảnh, dưới dạng ma trận. Chúng tôi thậm chí có thể tạo một hình ảnh bằng cách sử dụng ma trận và lưu nó! Sẽ cho bạn thấy làm thế nào, ở phần sau của bài đăng này. Hãy xem hình ảnh này dưới đây:

Giá trị pixel hình ảnh | Xử lý hình ảnh với OpenCV

Hình ảnh 2

Hình ảnh này là một ví dụ về cách biểu diễn ma trận của một hình ảnh trông như thế nào. Ở bên trái, là hình ảnh của Lincoln, ở giữa, các giá trị pixel được gắn nhãn bằng các số từ 0 đến 255, biểu thị cường độ hoặc độ sáng của chúng và ở bên phải, các số trong ma trận tự tạo thành. Mỗi giá trị trong ma trận tương ứng với một pixel, là phần tử nhỏ nhất của thông tin có trong ảnh. Kiểm tra các giá trị pixel hình ảnh bằng cách chỉ in biến mà bạn đã tải hình ảnh!

in (img)

Độ phân giải hình ảnh:

Độ phân giải hình ảnh có thể được định nghĩa là số lượng pixel có trong một hình ảnh. Chất lượng của hình ảnh tăng lên khi số lượng pixel tăng lên. Chúng ta đã thấy trước đó, hình dạng của hình ảnh cung cấp số lượng hàng và cột. Đây có thể nói là độ phân giải của hình ảnh đó. Một số độ phân giải tiêu chuẩn mà hầu như ai cũng biết là 320 x 240 pixel (chủ yếu phù hợp trên các thiết bị màn hình nhỏ), 1024 x 768 pixel (thích hợp để xem trên màn hình máy tính tiêu chuẩn), 720 x 576 pixel (tốt để xem trên TV độ phân giải tiêu chuẩn bộ có tỷ lệ khung hình 4: 3), 1280 x 720 pixel (để xem trên màn hình rộng), 1280 x 1024 pixel (tốt để xem ở kích thước toàn màn hình trên màn hình LCD có tỷ lệ khung hình 5: 4), 1920 x 1080 pixel (để xem trên TV HD) và bây giờ chúng tôi thậm chí có độ phân giải 4K, 5K và 8K lần lượt là 3840 x 2160 pixel, 5120 × 2880 pixel và 7,680 x 4,320 pixel được hỗ trợ bởi màn hình và TV độ nét cực cao.

Khi chúng ta nhân số cột và số hàng, chúng ta có thể thu được tổng số pixel có trong hình ảnh. Ví dụ: trong một hình ảnh 320 x 240, tổng số pixel có trong nó là 76,800 pixel.

Xem hình ảnh

Hãy để chúng tôi xem làm thế nào để hiển thị hình ảnh trong một cửa sổ. Muốn vậy, chúng ta phải tạo một cửa sổ GUI để hiển thị hình ảnh trên màn hình. Tham số đầu tiên phải là tiêu đề của màn hình cửa sổ GUI, được chỉ định ở định dạng chuỗi. Chúng ta có thể hiển thị hình ảnh trong cửa sổ bật lên bằng phương thức cv2.imshow (). Tuy nhiên, khi bạn cố gắng đóng nó, bạn có thể cảm thấy bị mắc kẹt với cửa sổ của nó. Vì vậy, để chống lại điều đó, chúng ta có thể sử dụng phương pháp "waitKey" đơn giản. Hãy thử phần mã này trong một ô mới:

cv2.imshow ('Mandrill', img) k = cv2.waitKey (0) nếu k == 27 hoặc k == ord ('q'): cv2.destroyAllWindows ()

Ở đây, chúng tôi đã chỉ định tham số "0" trong "waitKey" để giữ cho cửa sổ mở cho đến khi chúng tôi đóng nó. (Bạn cũng có thể cung cấp thời gian bằng mili giây, thay vì 0, chỉ định thời gian nó sẽ được mở.) Sau đó, chúng ta có thể chỉ định biến để đóng cửa sổ khi chúng ta nhấn phím 'ESC' hoặc phím ' NS'. Phương thức cv2.destroAllWindows () được sử dụng để đóng hoặc xóa các cửa sổ GUI khỏi màn hình / bộ nhớ.

Lưu hình ảnh

Trước khi lưu hình ảnh, làm thế nào về chuyển đổi hình ảnh sang thang độ xám và sau đó lưu nó? Chuyển đổi hình ảnh sang thang độ xám bằng cách sử dụng:

màu xám = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)

Bây giờ chúng ta có thể lưu hình ảnh:

cv2.imwrite ('Mandrill_grey.jpg', màu xám)

và kiểm tra hình ảnh đang được lưu trong thư mục làm việc hiện tại. Tham số đầu tiên tương ứng với tên của tệp mà hình ảnh sẽ được lưu và tham số thứ hai là biến chứa hình ảnh (thông tin pixel).

Trích xuất các mặt phẳng bit hình ảnh và tái tạo lại chúng

Chúng ta có thể chia một hình ảnh thành các mức mặt phẳng bit khác nhau. Ví dụ, chia một hình ảnh thành các mặt phẳng 8 bit (0-7), trong đó một vài mặt phẳng cuối cùng chứa phần lớn thông tin cho một hình ảnh.

kế hoạch bit

Hình ảnh 3

Để thực hiện việc này, chúng ta có thể nhập thêm hai gói:

import matplotlib.pyplot as plt import numpy as np

Nếu bạn gặp lỗi khi nhập bất kỳ gói nào, bạn có thể cài đặt chúng bằng cách sử dụng:

cài đặt conda -c conda-forge matplotlib cài đặt conda -c anaconda numpy

Bây giờ chúng ta đang xác định một hàm để trích xuất từng mặt phẳng trong số 8 mặt phẳng bit của hình ảnh.

def extract_bit_plane (cd): # giải nén tất cả từng bit một # từ 1 đến 8 trong biến # từ c1 đến c8 tương ứng c1 = np.mod (cd, 2) c2 = np.mod (np.floor (cd / 2) , 2) c3 = np.mod (np.floor (cd / 4), 2) c4 = np.mod (np.floor (cd / 8), 2) c5 = np.mod (np.floor (cd / 16) ), 2) c6 = np.mod (np.floor (cd / 32), 2) c7 = np.mod (np.floor (cd / 64), 2) c8 = np.mod (np.floor (cd / 128), 2) # kết hợp lại hình ảnh để tạo thành tương đương với hình ảnh thang độ xám ban đầu cc = 2 * (2 * (2 * c8 + c7) + c6) # tái tạo hình ảnh với 3 mặt phẳng bit quan trọng nhất thành_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] fig, axis = plt.subplots (nrows = 2, ncols = 5, figsize = (10, 8), subplot_kw = {'xticks': [], ' yticks ': []}) fig.subplots_adjust (hspace = 0.05, wspace = 0.05) cho ax, i in zip (axis.flat, to_plot): ax.imshow (i, cmap =' gray ') plt.tight_layout () plt.show () trả về cc

Bây giờ chúng ta đã sẵn sàng để gọi hàm.

Retruct_image = extract_bit_plane (màu xám)

Chúng tôi đã dựng lại hình ảnh (gần như tương tự) bằng cách sử dụng ba mặt phẳng cuối cùng, tức là mặt phẳng thứ sáu, thứ bảy và thứ tám. Và kết quả như sau:

dựng lại hình ảnh | Xử lý hình ảnh với OpenCV

Làm thế nào về việc chúng tôi xây dựng một hình ảnh nhỏ của riêng mình? Hãy thử nó ngay bây giờ!

Xây dựng một hình ảnh tổng hợp nhỏ

Chúng tôi có thể cố gắng tạo một hình ảnh tổng hợp chứa bốn hình vuông đồng tâm với bốn giá trị cường độ pixel khác nhau,

40, 80, 160 và 220.

con_img = np.zeros ([256, 256]) con_img [0:32,:] = 40 # hàng trên con_img [:,: 32] = 40 # cột bên trái con_img [:, 224: 256] = 40 # cột bên phải con_img [224 :,:] = 40 # hàng dưới con_img [32:64, 32: 224] = 80 # hàng trên con_img [64: 224, 32:64] = 80 # cột bên trái con_img [64: 224, 192: 224] = 80 # cột bên phải con_img [192: 224, 32: 224] = 80 # hàng dưới con_img [64:96, 64: 192] = 160 # hàng trên con_img [96: 192, 64:96] = 160 # cột bên trái con_img [96: 192, 160: 192] = 160 # cột bên phải con_img [160: 192, 64: 192] = 160 # hàng dưới con_img [96: 160, 96: 160] = 220 plt.imshow (con_img)

Hình ảnh kết quả sẽ như thế này:

đầu ra

Chúng ta có thể xem xét việc sử dụng các bộ lọc và biến đổi khác nhau trên hình ảnh trong một bài viết khác.

Cảm ơn bạn đã đọc bài viết.

meme

Hình ảnh 4

Hãy thêm đề xuất của bạn dưới phần bình luận và chia sẻ nếu bạn thích bài viết này. Mã lập trình Python hoàn chỉnh trong Máy tính xách tay Jupyter, được đề cập trong bài viết này có sẵn trên kho lưu trữ Github của tôi:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

Tài liệu tham khảo:

  1. Hình ảnh 1 - https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Hình ảnh 2- https://towardsdatascience.com/everything-you-ever-wished-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. Hình ảnh 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-create-a-computer-vision-algorithm-you-must-ctures-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của Tác giả.

Nguồn: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

Dấu thời gian:

Thêm từ Phân tích Vidhya