Xử lý hình ảnh trong Python: từ thuật toán đến công cụ – VinBigData

Xử lý hình ảnh là kỹ thuật cốt lõi của thị giác máy tính, giúp tăng trưởng nhiều ứng dụng trong thực tiễn như robot, xe hơi tự lái và camera mưu trí, phát hiện đối tượng người dùng, …. Xử lý ảnh được cho phép quy đổi và thao tác trên hàng nghìn ảnh cùng lúc, từ đó trích xuất những thông tin chi tiết cụ thể và quan trọng. Bài viết này sẽ cùng bạn tò mò về giải quyết và xử lý hình ảnh bằng Python : từ thuật toán, công cụ đến chiêu thức hữu dụng. Cùng lưu lại và tìm hiểu thêm thêm nhé !

Các thuật toán xử lý hình ảnh cổ điển

1, Xử lý ảnh hình thái học (Morphological Image Processing)

Morphological Image Processing gồm những phép toán phi tuyến tính ( non-linear ) ảnh hưởng tác động đến hình dạng hoặc hình thái của ảnh nhị phân. Thuật toán này vô hiệu những điểm nhiễu và làm mịn hình ảnh .
Xử lý hình thái học cũng hoàn toàn có thể được lan rộng ra cho hình ảnh thang độ xám. Nó gồm có những thao tác phi tuyến tính tương quan đến cấu trúc của những vị trí trong ảnh, nhờ vào vào thứ tự px. Kỹ thuật này nghiên cứu và phân tích một hình ảnh bằng cách sử dụng thành phần cấu trúc ( structuring element ) đặt ở những vị trí khác nhau trong hình ảnh và được so sánh với những px lân cận tương ứng. Phần tử cấu trúc là một ma trận nhỏ với những giá trị 0 và 1 .

Hai thao tác cơ bản của quá trình xử lý hình thái học là Dilation (phép giãn) và Erosion (phép co)

  • Phép giãn thêm pixel vào ranh giới của đối tượng trong một hình ảnh
  • Phép co loại bỏ các pixel khỏi ranh giới đối tượng.

Số lượng px được xóa hoặc thêm vào hình ảnh gốc phụ thuộc vào vào size của thành phần cấu trúc .
Nguồn: neptune.ai

2. Xử lý hình ảnh Gaussian

Gaussian blur ( làm mờ / mịn Gaussian ) là tác dụng của việc làm mờ hình ảnh bởi một hàm Gaussian .
Kỹ thuật này được sử dụng để giảm nhiễu ảnh và những chi tiết cụ thể. Hiệu ứng hình ảnh của kỹ thuật Gaussian tương tự như như việc nhìn một hình ảnh qua màn hình hiển thị mờ. Trong thị giác máy tính, Gaussian được sử dụng để tăng cường hình ảnh ở những quy mô khác nhau hoặc như một kỹ thuật tăng cường tài liệu trong học sâu .
Hàm gaussian cơ bản được trình diễn như sau :
Nguồn: neptune.ai
Trong thực tiễn, hoàn toàn có thể tận dụng đặc tính hoàn toàn có thể phân tách của Gaussian blur để chia quy trình thành 2 lần. Lần tiên phong, kernel một chiều ( nhân hệ điều hành quản lý ) được sử dụng để làm mờ hình ảnh chỉ theo hướng ngang hoặc dọc. Lần thứ hai, kernel một chiều tựa như được dùng để làm mờ theo hướng còn lại. Kết quả thu được là kernel hai chiều. Dưới đây là một ví dụ trực quan để hiểu ảnh hưởng tác động của bộ lọc Gaussian so với hình ảnh
Nguồn: neptune.ai
Có thể thấy, Gaussian filter là bộ lọc thông thấp, tức là làm suy yếu những tần số cao. Nó thường được sử dụng trong phát hiện cạnh .

3. Fourier Transform trong xử lý ảnh

Phép đổi khác Fourier chia hình ảnh thành những thành phần sin và cosin. Nó có nhiều ứng dụng như tái tạo hình ảnh, nén hình ảnh hoặc lọc hình ảnh .
Một hình sin gồm có ba yếu tố :

  • Độ lớn – liên quan đến độ tương phản
  • Tần số không gian – liên quan đến độ sáng
  • Pha – liên quan đến thông tin màu

Hình ảnh trong miền tần số bộc lộ như sau :
Nguồn: neptune.ai
Công thức được cho phép biến hóa fourier rời rạc 2D là :
Nguồn: neptune.ai
Trong công thức trên, f ( x, y ) bộc lộ hình ảnh .
Phép đổi khác fourier nghịch đảo chuyển phép đổi khác trở lại hình ảnh. Công thức được cho phép đổi khác fourier rời rạc nghịch đảo 2D là :
Nguồn: neptune.ai

4. Phát hiện cạnh trong xử lý ảnh

Phát hiện cạnh là một kỹ thuật giải quyết và xử lý hình ảnh để tìm ranh giới của những đối tượng người tiêu dùng trong hình ảnh. Nó hoạt động giải trí bằng cách phát hiện những điểm không liên tục về độ sáng. Thuật toán này hoàn toàn có thể nhanh gọn phản ứng nếu phát hiện một số ít nhiễu trong ảnh đồng thời phát hiện những biến thể của mức xám. Các cạnh được định nghĩa là cực đại cục bộ của gradient .
Thuật toán phát hiện cạnh phổ cập nhất là thuật toán phát hiện cạnh sobel. Toán tử phát hiện Sobel được tạo thành từ những hạt nhân chập 3 * 3. Một kernel đơn thuần Gx và một kernel xoay 90 độ Gy. Các phép đo riêng không liên quan gì đến nhau được thực thi bằng cách vận dụng cả hai kernel riêng không liên quan gì đến nhau vào hình ảnh .

Nguồn: neptune.ai

* biểu thị phép toán tích chập xử lý tín hiệu 2D.

Gradient hiệu quả hoàn toàn có thể được tính như sau :

Nguồn: neptune.ai

5. Xử lý hình ảnh Wavelet

Phép đổi khác Fourier chỉ số lượng giới hạn ở tần số, trong khi đó Wavelet xem xét cả thời hạn và tần suất. Biến đổi này tương thích với những tín hiệu không cố định và thắt chặt .
Cạnh là một trong những phần quan trọng của hình ảnh, tuy nhiên, khi vận dụng những bộ lọc truyền thống lịch sử, nhiễu được vô hiệu nhưng hình ảnh bị mờ. Biến đổi Wavelet được phong cách thiết kế để có được độ phân giải tần số tốt cho những thành phần tần số thấp. Dưới đây là ví dụ về đổi khác wavelet 2D
Nguồn: neptune.ai

Các công cụ xử lý hình ảnh

1. OpenCV

OpenCV là viết tắt của Open Source Computer Vision Library. Thư viện này gồm có khoảng chừng hơn 2000 thuật toán được tối ưu hóa hữu dụng cho thị giác máy tính và học máy. Có một số ít cách bạn hoàn toàn có thể sử dụng OpenCV trong giải quyết và xử lý hình ảnh như sau :

  • Chuyển đổi hình ảnh từ không gian màu này sang không gian màu khác, chẳng hạn như giữa BGR và HSV, BGR và màu xám, v.v.
  • Thực hiện ngưỡng trên hình ảnh, như, ngưỡng đơn giản, ngưỡng thích ứng, v.v.
  • Làm mịn hình ảnh, như, áp dụng các bộ lọc tùy chỉnh cho hình ảnh và làm mờ hình ảnh.
  • Thực hiện các phép toán hình thái trên ảnh.
  • Xây dựng hình kim tự tháp.
  • Trích xuất tiền cảnh từ hình ảnh bằng thuật toán GrabCut.
  • Phân đoạn ảnh sử dụng thuật toán watershed.

2. Hình ảnh Scikit

Scikit là một thư viện mã nguồn mở được sử dụng để tiền giải quyết và xử lý hình ảnh. Nó sử dụng học máy với những tính năng tích hợp và hoàn toàn có thể thực thi những hoạt động giải trí phức tạp trên hình ảnh chỉ với một vài công dụng .
Scikit hoạt động giải trí với những mảng numpy và là một thư viện khá đơn thuần ngay cả so với những người mới làm quen với python. Một số thao tác hoàn toàn có thể được thực thi bằng hình ảnh scikit là :

  • Để triển khai các hoạt động tạo ngưỡng, hãy sử dụng phương thức try_all_threshold () trên hình ảnh. Nó sẽ sử dụng bảy thuật toán ngưỡng toàn cầu. Đây là trong mô-đun bộ lọc.
  • Để thực hiện phát hiện cạnh, hãy sử dụng phương thức sobel () trong mô-đun bộ lọc. Phương pháp này yêu cầu hình ảnh thang độ xám 2D làm đầu vào, vì vậy chúng ta cần chuyển đổi hình ảnh sang thang độ xám.
  • Để thực hiện làm mịn gaussian, hãy sử dụng phương thức gaussian () trong mô-đun bộ lọc.
  • Để áp dụng cân bằng biểu đồ, hãy sử dụng mô-đun phơi sáng
  • Để áp dụng cân bằng biểu đồ bình thường cho hình ảnh gốc, hãy sử dụng phương thức equalize_hist ()
  • Để áp dụng cân bằng thích ứng, hãy sử dụng phương thức equalize_adapthist ().
  • Để xoay hình ảnh, hãy sử dụng hàm xoay () trong mô-đun biến đổi.
  • Để thay đổi tỷ lệ hình ảnh, hãy sử dụng hàm rescale () từ mô-đun biến đổi.
  • Để áp dụng các phép toán hình thái, hãy sử dụng hàm binary_e wear () và binary_dilation () trong mô-đun hình thái học.

3. PIL / PILLOW

PIL là viết tắt của Python Image Library. Đây là một trong những thư viện can đảm và mạnh mẽ, tương hỗ một loạt những định dạng hình ảnh như PPM, JPEG, TIFF, GIF, PNG và BMP .
Nó hoàn toàn có thể giúp bạn thực thi 1 số ít thao tác trên hình ảnh như xoay, biến hóa kích cỡ, cắt xén, chia tỷ suất màu xám, v.v. Hãy xem qua một số ít thao tác đó

  • Để tải một hình ảnh, hãy sử dụng phương thức open ().
  • Để hiển thị một hình ảnh, hãy sử dụng phương thức show ().
  • Để biết định dạng tệp, hãy sử dụng thuộc tính format
  • Để biết kích thước của hình ảnh, hãy sử dụng thuộc tính size
  • Để biết về thuộc tính chế độ sử dụng định dạng pixel.
  • Để lưu tệp hình ảnh sau khi xử lý, hãy sử dụng phương thức save (). Pillow lưu tệp hình ảnh ở định dạng png.
  • Để thay đổi kích thước hình ảnh, hãy sử dụng phương thức resize () nhận hai đối số là chiều rộng và chiều cao.
  • Để cắt hình ảnh, hãy sử dụng phương thức crop () lấy một đối số dưới dạng một bộ hộp xác định vị trí và kích thước của vùng được cắt.
  • Để xoay hình ảnh, hãy sử dụng phương thức xoay () nhận một đối số là số nguyên hoặc số thực thể hiện mức độ xoay.
  • Để lật hình ảnh, hãy sử dụng phương thức biến đổi () lấy một đối số trong số các đối số sau: Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, Image.ROTATE_90, Image.ROTATE_180, Image.ROTATE_270.

4. NumPy

Với thư viện này, bạn cũng hoàn toàn có thể thực thi những kỹ thuật hình ảnh đơn thuần, ví dụ điển hình như lật hình ảnh, trích xuất những tính năng và nghiên cứu và phân tích chúng .
Hình ảnh hoàn toàn có thể được màn biểu diễn bằng những mảng đa chiều và do đó kiểu của chúng là NdArrays. Hình ảnh màu là một mảng có 3 chiều. Bằng cách cắt mảng đa chiều, những kênh RGB hoàn toàn có thể được tách ra .
Dưới đây là một số ít thao tác hoàn toàn có thể được thực thi bằng NumPy trên hình ảnh ( hình ảnh được tải trong một biến có tên test_img bằng cách sử dụng imread ) .

  • Để lật hình ảnh theo hướng dọc, hãy sử dụng np.flipud (test_img).
  • Để lật hình ảnh theo hướng ngang, hãy sử dụng np.fliplr (test_img).
  • Để đảo ngược hình ảnh, hãy sử dụng test_img [:: – 1] (hình ảnh sau khi lưu trữ dưới dạng mảng numpy được đặt tên là ).
  • Để thêm bộ lọc vào hình ảnh, bạn có thể làm như sau:

Ví dụ : np.where ( test_img > 150, 255, 0 ), tức là trong hình này nếu tìm thấy bất kể thứ gì bằng 150, thì hãy thay thế sửa chữa nó bằng 255, nếu không thì 0 .
Bạn cũng hoàn toàn có thể hiển thị những kênh RGB riêng không liên quan gì đến nhau. Nó hoàn toàn có thể được thực thi bằng cách sử dụng đoạn mã này :
Để có được kênh màu đỏ, hãy triển khai test_img [ :, :, 0 ], để có được kênh màu xanh lá cây, hãy triển khai test_img [ :, :, 1 ] và để có được kênh màu xanh lam, hãy thực thi test_img [ :, :, 2 ] .

5. Mahotas

Đây là một thư viện xử lý hình ảnh và thị giác máy tính và có hơn 100 chức năng. Nhiều thuật toán của nó được thực hiện bằng C ++. Bản thân Mahotas là một mô-đun độc lập, tức là nó có phụ thuộc tối thiểu.

Hiện tại, Mahotas chỉ nhờ vào vào trình biên dịch C + + để tính toán số, không cần mô-đun NumPy, trình biên dịch thực thi toàn bộ việc làm của nó .
Dưới đây là tên của 1 số ít thuật toán đáng chú ý quan tâm có sẵn trong Mahotas :

  • Watershed (https://mahotas.readthedocs.io/en/latest/distance.html)
  • Hoạt động Hình thái (https://mahotas.readthedocs.io/en/latest/morphology.html)
  • Nhấn & bỏ lỡ, làm mỏng. (https://mahotas.readthedocs.io/en/latest/api.html#mahotas.hitmiss)
  • Chuyển đổi không gian màu (https://mahotas.readthedocs.io/en/latest/color.html)
  • Các tính năng mạnh mẽ được tăng tốc (SURF), một dạng tính năng cục bộ.
  • (https://mahotas.readthedocs.io/en/latest/surf.html)
  • Ngưỡng. (https://mahotas.readthedocs.io/en/latest/thresholding.html)
  • Chuyển đổi. (https://mahotas.readthedocs.io/en/latest/api.html)
  • Nội suy Spline (https://mahotas.readthedocs.io/en/latest/api.html)
  • SLIC superpixels. (https://www.pyimagesearch.com/2014/07/28/a-slic-superpixel-tutorial-using-python/)

Hãy xem xét 1 số ít thao tác hoàn toàn có thể được thực thi bằng Mahotas :

  • Để đọc một hình ảnh, hãy sử dụng phương thức imread ().
  • Để tính giá trị trung bình của hình ảnh, hãy sử dụng phương thức mean ().
  • Độ lệch tâm của một hình ảnh đo độ dài ngắn nhất của các đường đi từ một đỉnh v cho trước đến bất kỳ đỉnh w nào khác của một đồ thị liên thông.
  • Để tìm độ lệch tâm của hình ảnh, hãy sử dụng phương thức eccentricity () trong mô-đun tính năng.
  • Đối với phép giãn và phép co trên hình ảnh sử dụng phương thức dilate () và xói mòn () trong mô-đun morph.
  • Để tìm cực đại cục bộ của hình ảnh, hãy sử dụng phương thức locmax ().