Thuật toán Morphological Transform

Một phần của tài liệu (LUẬN văn THẠC sĩ) NHẬN DẠNG CHỖ đỗ XE ô tô BẰNG CAMERA (Trang 32)

Biến đổi hình thái là một số thao tác đơn giản dựa trên hình dạng ảnh. Nó thường được thực hiện trên hình ảnh nhị phân. Nó cần hai đầu vào, một là hình ảnh gốc của chúng, cái thứ hai được gọi là structuring element hoặc kernel quyết định tính chất của hoạt động. Hai toán tử hình thái cơ bản là Erosion và Dilation. Sau đó là các biến thể của nó như Opening, Closing, Gradient .v.v. cũng được sử dụng.

17

Hình 2. 7: Hình ảnh gốc sử dụng trong thuật toán này

Các toán tử trong thuật toán Morphological Transform

Erosion

Ý tưởng cơ bản về Erosion cũng giống như xói mòn đất, nó làm xói mòn ranh giới của đối tượng tiền cảnh (luôn cố gắng giữ tiền cảnh màu trắng). Kernel trượt qua hình ảnh (như trong tích chập 2D). Một pixel trong ảnh gốc (1 hoặc 0) sẽ chỉ được coi là 1 nếu tất cả các pixel trong kernel là 1, nếu không bị xói mòn (được tạo thành 0).

Vì vậy, điều xảy ra là tất cả các pixel gần ranh giới sẽ bị loại bỏ tùy thuộc vào kích thước kernel. Vì thế độ dày hoặc kích thước của đối tượng mặt trước giảm hoặc đơn giản là vùng trắng giảm trong ảnh. Nó rất hữu ích để loại bỏ những nhiễu trắng nhỏ, tách hai đối tượng có blob bị dính vào với nhau… Tham khảo hình ảnh sau đây:

Hình 2. 8: Hình ảnh minh họa Erosion

18

Dilation

Nó trái ngược với Erosion. Ở đây, một pixel bằng 1 nếu ít nhất một pixel trong kernel bằng 1. Vì vậy, nó làm tăng vùng trắng trong hình ảnh hoặc tăng kích thước của đối tượng tiền cảnh. Thông thường, trong các trường hợp như loại bỏ nhiễu, xói mòn được theo dõi bởi sự giãn nở. Bởi vì, Erosion loại bỏ những nhiễu trắng nhưng nó cũng thu nhỏ đối tượng của chúng ta. Vì vậy, chúng ta làm giãn nó vì nhiễu biến mất nhưng diện tích của đối tượng tăng lên. Điều này hữu ích trong việc nối các phần bị hỏng của một đối tượng. Tham khảo hình ảnh sau đây:

Hình 2. 9: Hình ảnh minh họa Dilation Opening

Opening thực hiện co (Erosion) trước sau đó mới thực hiện phép giãn nở (Dilation). Nó được ứng dụng trong việc loại bỏ các phần lồi lõm và làm cho đường bao các đối tượng trong ảnh trở nên mượt mà hơn. Tham khảo hình ảnh sau đây:

Hình 2. 10: Hình ảnh minh họa Opening

19

Closing

Là sự đảo ngược với Opening, nó thực hiện phép giãn nở (Dilation) trước sau đó mới thực hiện phép co (Erosion). Nó thường được dùng trong ứng dụng làm trơn đường bao các đối tượng, lấp đầy các khoảng trống biên và loại bỏ những hố nhỏ. Tham khảo hình ảnh sau đây:

Hình 2. 11: Hình ảnh minh họa Closing 2.3.4. Các phương pháp căn chỉnh ảnh

Ởđây, nhóm nghiên cứu đề xuất hai phương pháp nắn ảnh bao gồm: - Image Warping

- Image Calibration

Trước tiên, chúng ta cùng đi tìm hiểu về phương pháp Image Warping. Phương pháp này sử dụng thuật toán Homography. Chúng ta hãy cùng đi tìm hiểu Homography là gì.

Image warping

Hãy xem xét hai hình ảnh của một mặt phẳng (trên cùng một cuốn sách) được hiển thị trong Hình 2. 12. Dấu chấm đỏ biểu thị cùng một điểm vật lý trong hai hình ảnh. Trong thuật ngữ thị giác máy tính, những điểm tương ứng Hình 2. 12 cho thấy bốn điểm tương ứng bốn màu khác nhau – đỏ, xanh lá cây, vàng và cam. Homography là một phép biến đổi (ma trận 3 x 3) ánh xạ các điểm trong một hình ảnh sang các điểm tương ứng trong hình ảnh khác.

20

Hình 2. 12: Hai hình ảnh của một mặt phẳng 3D (trên cùng một cuốn sách) Homography là ma trận 3 x 3, chúng ta có thể viết dưới dạng.

ảnh đầu tiên và ( ) trong hình ảnh thứ 2. Sau đó, Homography ánh xạ chúng

theo cách sau:

Sắp xếp hình ảnh bằng cách sử dụng Homography

Phương trình đúng với tất cả các tập hợp các điểm tương ứng miễn là chúng nằm cùng trên một mặt phẳng trong thế giới thực. Nói cách khác, chúng ta có thể áp dụng Homography cho hình ảnh đầu tiên và cuốn sách trong hình ảnh đầu tiên sẽ được căn chỉnh với cuốn sách trong hình ảnh thứ 2. Xem Hình 2. 13

Hình 2. 13: Hình ảnh của mặt phẳng 3D có thể được căn chỉnh với một hình ảnh khác bằng Homography

Nhưng còn những điểm không có trên mặt phẳng thì sao? Chúng sẽ KHÔNG được căn chỉnh theo hình ảnh gốc như chúng ta có thể thấy trong Hình 2. 13. Nhưng nếu có hai mặt phẳng trong ảnh thì sao? Sau đó chúng ta có hai hình đồng nhất – mỗi hình một mặt phẳng.

Panorama: Một ứng dụng của Homography.

Trong phần trước, nếu chúng ta biết được một hình ảnh để đối chiếu giữa hai hình ảnh, chúng ta có thể nắn một hình ảnh này sang hình ảnh kia. Tuy nhiên, một điều phải được lưu ý. Các hình ảnh phải chứa một mặt phẳng (trên cùng một cuốn sách) và chỉ có phần phẳng được căn chỉnh chính xác. Nó chỉ ra rằng nếu chúng ta chụp ảnh bất kỳ cảnh nào (không chỉ là một mặt phẳng) và sau đó chụp ảnh thứ hai bằng cách xoay máy ảnh, hai hình ảnh có liên quan bằng một hình ảnh tương đồng! Nói cách khác, chúng ta có thể gắn máy ảnh của mình lên chân máy và chụp ảnh. Tiếp theo, xoay nó về trục dọc và chụp ảnh khác. Hai hình ảnh chúng ta vừa chụp về một cảnh 3D hoàn toàn tùy ý có liên quan đến nhau. Hai hình ảnh sẽ chia sẻ một số khu vực phổ biến có thể được căn chỉnh và ghép và đưa cho chúng ta một bức

22

tranh toàn cảnh từ hai hình ảnh. Nó thực sự không dễ dàng bởi vì còn rất nhiều thứ nữa để tạo ra một bức tranh toàn cảnh hoàn chỉnh, nhưng nguyên tắc cơ bản là căn chỉnh bằng cách sử dụng một bản sao và ghép chúng một cách thông minh để chúng ta không nhìn thấy các đường nối. Tạo ảnh toàn cảnh chắc chắn sẽ là một chủ đề trong tương lai.

Làm thế nào để tính toán Homography?

Để tính toán các điểm đồng nhất giữa hai hình ảnh, chúng ta cần biết ít nhất 4 điểm tương ứng giữa hai hình ảnh. Nó sẽ thậm chí tốt hơn nữa nếu chúng ta có nhiều hơn 4 điểm tương ứng. Để tính toán được ma trận cho đầy đủ các điểm là rất phức tạp, để thuận lợi và tăng tốc độ xử lý trong chương trình, tôi sẽ sử dụng chương trình đã được tối ưu và được chia sẻ trong thư viện OpenCV để ước tính chính xác nhất một Homography phù hợp với tất cả các điểm tương ứng. Thông thường, các điểm tương ứng được tự động tìm bằng cách kết hợp các tính năng như SIFT hoặc SURF giữa các hình ảnh.

'''

pts_src and pts_dst are numpy arrays of points in source and destination images. We need at least 4 corresponding points.

'''

h, status = cv2.findHomography(pts_src, pts_dst)

'''

The calculated homography can be used to warp the source image to destination. Size is the size (width,height) of im_dst

'''

im_dst = cv2.warpPerspective(im_src, h, size)

Image Calibration

Phương pháp tiếp theo là Image Calibration. Phương pháp này sử dụng thuật toán Camera Calibration and 3D Reconstruction. Các hàm trong phần này sử dụng mô hình được gọi là máy ảnh pinhole. Một máy ảnh đơn giản không có ống kính nhưng có khẩu độ nhỏ (được gọi là pinhole). Trong mô hình này, một khung cảnh được hình thành bằng cách chiếu các điểm 3D vào mặt phẳng hình ảnh sử dụng sự chuyển đổi phối cảnh.

23

Hoặc

Ởđây:

- ( ) là tọa độ của một điểm 3D trong không gian tọa độ thế giới. - ( ) là tọa độ của điểm chiếu tính bằng pixel.

- là ma trận camera hoặc ma trận các tham số nội tại ( ) là một điểm -

chính thường ở trung tâm hình ảnh.

- là độ dài tiêu cự được biểu thị bằng đơn vị pixel. -

Do đó, nếu một hình ảnh từ máy ảnh được chia tỷ lệ theo một yểu tố, tất cả các tham số này sẽ được chia tỷ lệ (nhân/ chia tương ứng) theo cùng một yếu tố. Ma trận của các tham số nội tại không phụ thuộc vào cảnh được xem. Vì vậy, một khi ước tính, nó có thể được sử dụng lại miễn là độ dài tiêu cự được cố định (trong trường hợp ống kính zoom). Ma trận xoay-dịch [R|t] được gọi là một ma trận các tham số bên ngoài. Nó được sử dụng để mô tả chuyển động của camera xung quanh một cảnh tĩnh hoặc ngược lại, chuyển động cứng của một vật thể trước camera tĩnh.

Nghĩa là [R|t] chuyển tọa độ của một điểm ( ) sang hệ tọa độ, được cố định đối với máy ảnh. Phép biến đổi ở trên tương đương với phần sau (khi z ≠ 0)

24

Hình ảnh dưới đây minh họa mô hình máy ảnh pinhole

Hình 2. 14: Hình ảnh minh họa máy ảnh pinhole

Các ống kính thực thường có một số biến dạng, chủ yếu là biến dạng xuyên tâm và biến dạng tiếp tuyến. Vì vậy, mô hình trên được mở rộng như sau:

V i:

biến dạng tiếp tuyến. Các hệ số bậc cao hơn không được xem xét trong OpenCV. Hình ảnh tiếp theo cho thấy hai loại biến dạng xuyên tâm phổ biến: biến dạng

25

Hình 2. 15: Các kiểu biến dạng hình ảnh

Trong các hàm bên dưới, các hệ số được thông qua hoặc trả về vectơ Nghĩa là, nếu vectơ chứa bốn phần tử, điều đó có nghĩa là k3 = 0. Các hệ số biến dạng không phụ thuộc vào cảnh được xem. Do đó, chúng phụ thuộc vào các thông số bên trong máy ảnh. Và chúng ta vẫn như cũ không phụ thuộc vào độ phân giải. Ví dụ, nếu một máy ảnh đã được hiểu chỉnh trên các hình ảnh có độ phân giải 320x240 thì hoàn toàn có thể sử dụng các hệ số biến dạng tương tự cho các hình ảnh 640x480 từ cùng một máy ảnh trong khi fx, fy, cx và cy cần được thu nhỏ một cách thích hợp.

Dựa trên thông tin về hai thuật toán trên chúng tôi đưa một bảng so sánh dưới đây:

Bảng 2. 2: Sự khác nhau giữa Image Warping và Image Calibration

Image Warping - Chỉ cần một hình ảnh (phương pháp 2D) - Chỉ cần 4 điểm - Xử lý các góc - Đơn giản

Từ so sánh trên, thấy được sự khác nhau giữa hai phương pháp cộng với nhu cầu sử dụng nên nhóm nghiên cứu lựa chọn sử dụng phương pháp Image Warping áp dụng cho đề tài. Phương pháp này cho phép chúng ta thu nhỏ (hoặc mở rộng) hình ảnh theo bất kỳ tỷ lệ nào cũng như để dịch và xoay nó.

26

2.3.5. Thuật toán Canny Edge Detection

Phát hiện cạnh Canny là một thuật toán phát hiện cạnh phổ biến. Nó được phát triển bởi John F. Canny vào năm 1986. Đây là một thuật toán gồm nhiều bước và chúng ta sẽ cùng đi tìm hiểu về thuật toán này.

Giải thuật phát hiện cạnh Canny gồm 4 bước chính sau:

- Giảm nhiễu: Làm mờ ảnh, giảm nhiễu dùng bộ lọc Gaussian kích thước 5x5.

Kích thước 5x5 thường hoạt động tốt cho giải thuật Canny. Dĩ nhiên ta cũng có thể thay đổi kích thước của bộ lọc làm mờ cho phù hợp. - Tính Gradient và hướng gradient: ta dùng bộ lọc Sobel X và Sobel Y (3x3) để tính được ảnh đạo hàm và . Tham khảo bài viết giải thích về gradient: Gradient của ảnh là gì?. Sau đó, ta tiếp tục tính ảnh Gradient và góc

của Gradient theo công thức. Ảnh đạo hàm và là ma trận (ví dụ: 640x640), thì kết quả tính ảnh đạo hàm Edge Gradient cũng là một ma trận (640x640), mỗi pixel trên ma trận này thể hiện độ lớn của biến đổi mức sáng

ở vị trí tương ứng trên ảnh gốc. Tương tự, ma trận Angle cũng có cùng kích thước (640x640), mỗi pixel trên Angle thể hiện góc, hay nói cách khác là hướng của cạnh. Ví dụ dễ hiểu, nếu góc gradient là 0 độ, thì cạnh của ta trên ảnh sẽ là một đường thẳng đứng (tức tạo góc 90 độ so với trục hoành) (vuông góc hướng gradient). Khi tính toán, giá trị hướng gradient sẽ nằm trong đoạn [-180, 180] độ, ta không giữ nguyên các góc này mà gom các giá trị này về 4 bin đại diện cho 4 hướng: hướng ngang (0 độ), hướng chéo bên phải (45 độ), hướng dọc (90 độ) và hướng chéo trái (135 độ).

- Non-maximum Suppression (viết tắt NMS): loại bỏ các pixel ở vị trí không phải cực đại toàn cục. Ở bước này, ta dùng một flter 3x3 lần lượt chạy qua các pixel trên ảnh gradient. Trong quá trình lọc, ta xem xét xem độ lớn gradient của pixel trung tâm có phải là cực đại (lớn nhất trong cục bộ - local maximum) so với các gradient ở các pixel xung quanh. Nếu là cực đại, ta sẽ

ghi nhận sẽ giữ pixel đó lại. Còn nếu pixel tại đó không phải là cực đại lân cận, ta sẽ set độ lớn gradient của nó về zero. Ta chỉ so sánh pixel trung tâm với 2 pixel lân cận theo hướng gradient. Ví dụ: nếu hướng gradient đang là 0 độ, ta sẽ so pixel trung tâm với pixel liền trái và liền phải nó. Trường hợp khác nếu hướng gradient là 45 độ, ta sẽ so sánh với 2 pixel hàng xóm là góc trên bên phải và góc dưới bên trái của pixel trung tâm. Tương tự cho 2 trường hợp hướng gradient còn lại. Kết thúc bước này ta được một mặt nạ nhị phân (ảnh nhị phân - tham khảo bài viết để hiểu ảnh nhị phân nhé). Tham khảo hình dưới:

Hình 2. 16: Sự khác nhau giữa Image Warping và Image Calibration

- Lọc ngưỡng: ta sẽ xét các pixel dương trên mặt nạ nhị phân kết quả của bước trước. Nếu giá trị gradient vượt ngưỡng max_val thì pixel đó chắc chắn là cạnh. Các pixel có độ lớn gradient nhỏ hơn ngưỡng min_val sẽ bị loại bỏ. Còn các pixel nằm trong khoảng 2 ngưỡng trên sẽ được xem xét rằng nó có nằm liền kề với những pixel được cho là "chắc chắn là cạnh" hay không. Nếu liền kề thì ta giữ, còn không liền kề bất cứ pixel cạnh nào thì ta loại. Sau bước này ta có thể áp dụng thêm bước hậu xử lý loại bỏ nhiễu (tức những pixel cạnh rời rạc hay cạnh ngắn) nếu muốn. Ảnh minh họa về ngưỡng lọc:

28

Hình 2. 17: Hình ảnh minh họa về ngưỡng lọc Phát hiện cạnh Canny trong OpenCV

OpenCV đặt tất cả các bước trên trong hàm cv2.Canny(). Chúng ta sẽ xem làm thế nào để sử dụng nó. Đối số đầu tiên là hình ảnh đầu vào của chúng ta. Đối số thứ hai và thứ ba lần lượt là minVal và maxVal. Đối số thứ ba là aperture_size. Nó là kích thước của Sobel kernel đã sử dụng để tìm độ dốc hình ảnh. Mặc định là 3. Đối số cuối cùng là L2gradient chỉ định phương trình tìm độ lớn của gradient. Nếu là True, nó sử dụng phương trình đã đề cập ở trên chính xác hơn, ngược lại, nếu là

False, nó sẽ sử dụng hàm:  

import cv2

import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('messi5.jpg',0)

edges = cv2.Canny(img,100,200)

plt.subplot(121),plt.imshow(img,cmap = 'gray')

plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122),plt.imshow(edges,cmap = 'gray')

plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

Kết quả hiển thị dưới đây:

Hình 2. 18: Hình ảnh kết quả của thuật toán phát hiện cạnh Canny

29

2.3.6. Thuật toán Hole Filling

Thuật toán Hole Filling là thuật toán hỗ trợ cho chúng ta khi làm việc với các mask. Khi thực hiện các bài toán nhận diện, đặc biệt là khi sử dụng nhận diện màu sắc, ta sẽ gặp rất nhiều nhiễu khiến cho các blob bị hổng, không hoàn chỉnh. Thuật toán Hole filling sẽ khắc phục những trường hợp này và tạo ra 1 mask hoàn chỉnh.

Cách thực hiện Hole filling như sau:

+ Bước 1: Đọc ảnh

+ Bước 2: Tạo Binary Edge của ảnh. Lúc này ta sẽ có boundary của object và cần làm cho các pixel phía bên trong boundary trở thành pixel trắng (bit 1)

Bước này được thực hiện bởi thuật toán Canny Edge Detection như đã nói ở phần trước

+ Bước 3: Sử dụng floodfill để thay đổi background từ bit 0 thành bit 1 (biến đổi màu đen thành trắng). Phần bên trong boundary vẫn được giữ nguyên. Floodfll là thuật toán mà khi ta chọn 1 pixel, tất cả các pixel có cùng màu và được kết nối với pixel đó sẽ cùng bị thay đổi màu sắc dựa theo màu được chọn. Ví dụ như trong hình

3., toàn bộ phần viền màu đen được kết nối với nhau đã được chuyển sang

Một phần của tài liệu (LUẬN văn THẠC sĩ) NHẬN DẠNG CHỖ đỗ XE ô tô BẰNG CAMERA (Trang 32)

Tải bản đầy đủ (DOCX)

(71 trang)
w