Chương trình MATLAB

Một phần của tài liệu Đánh giá các kết quả đạt được và giải pháp đề xuất (Trang 68)

Matlab là ngơn ngữ cấp cao dành cho tính tốn trong kỹ thuật. Nĩ tích hợp cả tính tốn, mơ phỏng và lập trình trong một mơi trường dễ sử dụng với các vấn đề và giải pháp được mơ tả dưới dạng các khái niệm tốn học quen thuộc. Trong lĩnh vực xử lý tín hiệu, Matlab thường được sử dụng. Matlab cĩ những ưu điểm như :

Tính tốn xử lý nhanh, hiệu quả các phép tốn về ma trận. Cĩ các cơng cụ đọc, lưu và hiển thị nhiều loại file ảnh.

Cĩ cơng cụ vẽ đồ thị nhanh và chính xác, giúp cho người lập trình khơng mất nhiều thời gian như các ngơn ngữ lập trình khác như C, C++, v...v. Cho phép nhúng những chương trình được viết bên ngồi Matlab như C và FORTRAN. Từ mơi trường Matlab, chúng ta cĩ gọi các hàm viết trên C, Fortran.

Với những ưu điểm trên, Matlab giúp cho người lập trình đỡ mất nhiều thời gian cho các cơng việc lặp lại nhàm chán. Hiện nay, Matlab đang được sử dụng rộng rãi trong các trường đại học kỹ thuật trên tồn thế giới. Tuy nhiên, Matlab cĩ nhược điểm là chạy chậm khi xử lý các vịng lặp WHILE, FOR.

Các chương trình C và Fortran cĩ thể gọi được từ Matlab gọi là các MEX- file. MEX-file là các chương trình con liên kết động mà trình biên dịch Matlab cĩ thể nạp và thực thi.

MEX-file cĩ nhiều ứng dụng như:

Những chương trình C và Fortran lớn đã viết xong cĩ thể được gọi từ Matlab mà khơng cần phải viết lại dưới dạng M-file.

Các vịng lặp lớn chạy khơng nhanh và hiệu quả trong Matlab cĩ thể được viết lại dưới dạng MEX-file cho hiệu quả.

Để kết hợp ưu điểm của hai loại cơng cụ lập trình, các chương trình ứng dụng sẽ viết bằng cơng cụ phần mềm Matlab và Turbo C. Tuy nhiên, MEX-file khơng hiệu quả cho tất cả mọi ứng dụng, khơng nên lạm dụng MEX-file. Nĩi chung, hầu hết ứng dụng nên được viết trong Matlab. Khơng sử dụng MEX-file trừ khi chương trình ứng dụng yêu cầu.

3.2 Lưu đồ giải thuật chương trình

Thách thức trong việc thực hiện giải thuật phân đoạn này là quản lý các biến và các cấu trúc của dữ liệu. Hầu hết các hàm đều cĩ xử lý với cấu trúc dữ liệu ba chiều. Vì vậy, phải rất thận trọng trong việc xử lý để tránh bị luẩn quẩn trong các vịng lặp.

Cả hai ngơn ngữ Matlab và C đều cĩ các kiểu cơ sở dữ liệu chặt chẽ và cả hai là khác nhau. Do đĩ, khi lập trình tạo MEX-file cần lưu ý vấn đề này, đặc biệt là trong việc lưu trữ, xử lý các mảng, các ma trận, quản lý các biến cũng sẽ cĩ đơi lúc khác nhau.

Để thuận tiện cho việc gỡ rối, hiệu chỉnh chương trình và dễ kiễm tra; ta phân tách chương trình lớn ra thành nhiều chương trình con nhỏ hơn và sau đĩ ghép lại thành chương trình lớn. Càng lập trình càng hiểu ý nghĩa của việc chia nhỏ chương trình thành các modul ví như nguyên tắc ‘Chia để trị, chia để dễ điều khiển’.

Lưu đồ giải thuật của chương trình chính xem hình 3.1.

Chương trình tiền xử lý preprocess.m:

Xem lưu đồ giải thuật của chương trìnhở hình 3.2. Các tham số ngõ vào:

Tên và đường dẫn của ảnh.

Khoảng cách: vector khoảng cách (tính theo inches) sử dụng để tạo các bộ lọc.

k: sử dụng cho k-means clustering. Đây là số cluster ban đầu. Các tham số ngõ ra:

pyr : ma trận M×N×L các ảnh.

Masks: ma trận M×N×C chứa các ma trận nhị phân M×N xác định các pixel của mỗi cluster.

Confidences: ma trận M×N×C, trong đĩ mỗi thành phần (i, j, k) là xác suất pixel (i, j) thuộc cluster thứ k.

Stds: vector C×1 chứa độ lệch chuẩn của khoảng cách từ giá trị mean của mỗi cluster.

Means: vector C×3 chứa các mean trong khơng gian LAB của các cluster.

Chương trình tạo pyramid:

Xem lưu đồ giải thuật của chương trình ở hình 3.3. Các tham số ngõ vào:

Ma trận ảnh: ma trận M×N×3 trong khơng gian RGB.

Khoảng cách: vector khoảng cách (tính theo inches) sử dụng để tạo các bộ lọc.

Các tham số ngõ ra:

M: là một ma trận M×N×3×L, trong đĩ mỗi ảnh màu là một ma trận M×N×3, L là số phần tử của vector khoảng cách và cũng chính là số ảnh trong pyramid.

Chương trình lọc ảnh: (adsbygoogle = window.adsbygoogle || []).push({});

Chương trình thực hiện giải thuật lọc ảnh theo trực quan do Zhang và Wandell [6] đề xuất. Trước tiên, ta cần phải định rõ những điều kiện quan sát. Đặc biệt, ta cần phải biết thơng số khơng gian tương ứng khi ảnh được quan sát. Thơng số này cho ta biết cĩ bao nhiêu mẫu trên một độ của gĩc nhìn (degree of visual angle). Ta gọi là sampPerDeg. Đối với màn hình chuẩn (72 điểm trên một inch) được quan sát từ khoảng cách 18 inch, một inch sẽ tương ứng:

(180/pi)*actan(1/18) = 3.1798 deg.

Vì vậy, cĩ 72/3.1798 mẫu trên một độ của gĩc nhìn cho monitor này. Trong Matlab, thơng số này được tính như sau:

sampPerDeg = round(72/((180/pi)*atan(1/18))); Hoặc cĩ thể sử dụng hàm cĩ sẵn trong S-CIELAB:

SampPerDeg = round(visualAngle(-1, 18, 72, 1)); Cả hai cách đều cho cùng một kết quả là :

SampPerDeg = 23.

Lưu đồ giải thuật của chương trình lọc ảnh xem ở 3.4. Các tham số ngõ vào:

Ma trận của ảnh M×N×3. Số sampPerDeg

Các tham số ngõ ra:

Ma trận ảnh đã lọc M×N×3.

Trước khi cơ chế probabilistic relaxation được bắt đầu ở ảnh thơ nhất, chúng ta phải thực hiện một số xử lý trên ảnh thơ này. Bước đầu tiên là ta thực hiện K- means clustering với K rất lớn để tạo ra các cluster ban đầu.

K-means clustering sử dụng giá trị của các pixel trong khơng gian màu LAB và toạ độ (x, y) của các pixel. Tập hợp các means ban đầu là tập hợp các điểm phân bố một cách ngẫu nhiên trong khơng gian (x, y, L, a, b). Trong mỗi lần lặp, mỗi pixel được gán với cluster “gần” nĩ nhất. Khoảng cách ở đây được định nghĩa là norm của vector khác biệt. Vector khác biệt là hiệu của tọa độ (x, y, L, a, b) của pixel với tọa độ của mean. Sau khi tất cả các pixel được phân loại, mean của các cluster phải tính tốn lại. Tiến trình này được tiếp tục cho đến khi giá trị của các mean ốn định, được xác định bằng một mức ngưỡng.

Lưu đồ giải thuật của chương trình xem hình 3.5. Các tham số ngõ vào:

Ma trận ảnh M×N×3. Số cluster ban đầu k. Các tham số ngõ ra:

Clusters: ma trận M×N×C, trong đĩ C là số cluster (khác với số cluster ban đầu k). Nếu một pixel (x,y) thuộc cluster c thì clusters(y,x,c) = 1. Mus: ma trận C×3 chứa các giá trị mean cuối cùng của mỗi cluster.

Gs: ma trận M×N, trong đĩ mỗi thành phần của ma trận chứa số thứ tự của nhĩm chứa pixel này.

Mapping: vector C×1 chứa số thứ tự nhĩm của mỗi cluster.

Chương trình tính các group cho các pixel

Các tham số ngõ vào:

ImageVect: là ma trận M×N×5 chứa các vector mẫu. numClusters: số lượng các cluster.

Các tham số ngõ ra:

Groups: là ma trận (M×N)×1, trong đĩ mỗi phần tử của ma trận chứa khoảng cách nhỏ nhất từ pixel (x,y) đến các mean của các cluster.

Chương trình hội tụ các cluster

Chương trình thực hiện giải thuật hội tụ các cluster do GS. M. Petrou và M. Mirmehdi [14] đề xuất. Sau khi chúng ta đã cĩ một số lượng lớn các cluster nhỏ đạt được từ K-means clustering, chúng ta sẽ sử dụng chúng để tạo nên các cluster lớn hơn gọi là các cluster lõi.

Chúng ta duyệt qua tất cả các cluster. Ở mỗi cluster, tìm tất cả các cluster lân cận của nĩ. Nếu một cluster lân cận cĩ mean trong khơng gian Lab gần bằng với mean của cluster đang xét thì hai cluster này được hội tụ thành một cluster lớn hơn. Mức độ gần bằng ở đây được xác định bằng một mức ngưỡng. Tiến trình dừng khi khơng tìm thấy cluster nào nữa để hội tụ.

Kế tiếp, tìm các cluster khơng cĩ ý nghĩa bằng cách xem xét phần trăm pixel mà cluster này chiếm trên tồn bộ ảnh. Nếu phần trăm này thấp hơn mức ngưỡng thì cluster này bị hủy bỏ.

Lưu đồ giải thuật của chương trình xem hình 3.7. Các tham số ngõ vào:

Image: ma trận ảnh M×N×3.

Initgroups: ma trận M×N, trong đĩ mỗi thành phần của ma trận là số thứ

Clustermap: là ma trận C×1 dùng để ánh xạ một cluster vào một số thứ tự. (adsbygoogle = window.adsbygoogle || []).push({});

Initclusters: là ma trận M×N×C, mỗi ma trận M×N xác định các pixel

thuộc một cluster.

Means: ma trận C×3 chứa các giá trị mean của mỗi cluster.

Các tham số ngõ ra:

Newclusters, newgroups, newmap, newmeans là các dữ liệu được cập nhật lại sau khi hội tụ các cluster lân cận với mức ngưỡng cho trước. Những cluster chứa số pixel ít hơn một phần trăm cho trước cũng sẽ bị xĩa và các pixel của cluster này khơng được phân loại.

Chương trình tạo các cluster chung

Chương trình thực hiện giải thuật tạo các cluster chung do GS. M. Petrou và M. Mirmehdi [14] đề xuất. Với tập hợp mới các cluster sau khi hội tụ, chúng ta cần tính xác suất để bắt đầu tiến trình probabilistic relaxation đa phân giải. Những xác suất này, hay cịn gọi là độ tự tin, được tính cho mỗi cặp pixel-cluster. Một cluster lõi được hình thành bằng cách gắn các pixel cĩ độ tự tin với cluster này lớn hơn 80%.

Lưu đồ giải thuật của chương trình xem hình 3.8. Các tham số ngõ vào:

Image: ma trận ảnh M×N×3.

Initclusters: là ma trận M×N×C chứa các ma trận nhị phân biểu diễn các pixel thuộc một cluster.

Các tham số ngõ ra:

Stds: là vector C×1 chứa độ lệch chuẩn của các cluster cuối cùng. Mus: là ma trận C×3 chứa các mean của các cluster cuối cùng.

Probs: là ma trận M×N×C chứa mức độ chắc chắn mà mỗi pixel thuộc vào mỗi cluster c.

NewClusters là ma trận M×N×C chứa các ma trận nhị phân xác định các pixel thuộc các cluster mới.

Chương trình relaxation

Chương trình thực hiện giải thuật giãn nỡ theo xác suất do GS. M. Petrou và M. Mirmehdi [15] đề xuất. Lưu đồ giải thuật của chương trình xem hình 3.9. Các tham số ngõ vào:

Pyr: là một ma trận M×N×3×L, trong đĩ mỗi ảnh màu là một ma trận M×N×3, L là số phần tử của vector khoảng cách và cũng chính là số ảnh trong pyramid.

Masks: ma trận M×N×C chứa các ma trận nhị phân xác định các pixel của mỗi cluster.

Confidences: ma trận M×N×C, trong đĩ mỗi thành phần (i, j, k) là xác suất pixel (i, j) thuộc cluster thứ k.

Các tham số ngõ ra:

FinalMasks: là ma trận M×N×C’ chứa các ma trận nhị phân xác định các pixel của mỗi cluster sau khi relaxation.

Begin

(Tiền xử lý) Gọi chương trình con

preprocess.m

Relaxation

Hiển thị ảnh kết quả phân đoạn

End

Begin Đọc file ảnh, Hệ số k và khoảng cách (Tạo tower) Gọi createpyramid.m Hiển thị pyramid

(Thực hiện kmean clustering ở mức thơ nhất) Gọi kmeansclusters.m

(Hội tụ các cluster) Gọi clusterMerge.m (adsbygoogle = window.adsbygoogle || []).push({});

(Hình thành các cluster lõi) Gọi formCoreCluster.m

Hiển thị các cluster lõi

Trả lại các giá trị ngõ ra pyr, masks, confidences, stds, means.

Begin Lấy ma trận ảnh và các khoảng cách Tính sampPerDeg Chuyển ma trận ảnh từ RGB sang LMS i := 1 Gọi scielab.m

Chuyển ma trận ảnh từ OPP sang RGB

Xén các giá trị nằm ngồi phạm vi hợp lệ của RGB

Lưu ma trận này vào pyramid

i < N+1 Sai

Đúng Chuyển ma trận ảnh từ RGB sang LAB

Begin

Lấy ma trận ảnh LMS và sampPerDeg

Chuyển ma trận ảnh từ khơng gian màu LMS sang OPP

Tạo các bộ lọc cho từng mặt phẳng màu Lọc từng mặt phẳng màu Trả lại kết quả ma trận ảnh đã lọc End

Hình vẽ 3.4. Lưu đồ giải thuật lọc các ma trận của ảnh từng mặt phẳng màu riêng biệt

Begin

Lấy ma trận ảnh LAB và số cluster

Sắp xếp lại ảnh theo vector imageVect

Tạo ngẫu nhiên currentmus

Sắp xếp tính gs, clusters, mus, mapping

End

Phân loại các điểm dựa trên currentmus Gọi hàm kclassify.c

Oldmus := currentmus

Tính lại currentmus

Tính sai số delta giữa currentmus và oldmus

EPSILON < delta Đúng Sai

Begin

Nhập imageVect và means

i := 1

Trả lại giá trị groups cho hàm

End (adsbygoogle = window.adsbygoogle || []).push({});

group (i) := mind {dist(j)} j := j+1 ≤numGroups

Đúng

j := 1

Tính khoảng cách dist(j) từ mẫu (i) đến mean (j)

i := i +1 ≤ numPixels

Đúng

Sai

Sai

Nhập ma trận ảnh, initgroups, clusterMap, initClusters, means.

cind := 1

Tính và trả lại các giá trị newMeans, newClusters, newMap, newGroups

End

Tìm các group lân cận của group này.

Hội tụ 2 cluster Delta < mức ngưỡng

Đúng ind := 1

Tính sai lệch delta giữa group cind và group lân cận inc

ind := ind +1 ≤ numNeighbor

cind := cind +1 ≤ numClusters và số cluster mới > 1 Rồi Chưa Sai Đúng Sai Đúng Sai

Begin

Nhập ma trận ảnh, ma trận initClusters

ind := 1

Tính std, mean và conf của cluster thứ ind

Trả lại các giá trị newClusters, probs, stds, mus cho hàm.

End

Tạo cluster mới cĩ conf > mức ngưỡng ind := ind +1 ≤numClusters

Đúng j := 1

Chuẩn hĩa tất cả các hệ số confidences

j := j +1 ≤ numClusters

Đúng

Sai (adsbygoogle = window.adsbygoogle || []).push({});

Sai

Begin

Nhập ma trận pyr, masks, confidences.

pyrind := L - 1

Final masks

End Tính P(x), Q(x)

Tính masks mới, P(x) mới cĩ conf > mức ngưỡng

j := j+1 ≤numClusters Đúng j := 1 pyrind := pyrind -1 ≤ 1 Sai Đúng Sai Tính confs

Chuẩn hĩa các hệ số confs

3.3 Các kết quả

Chúng ta chọn ảnh gốc berries.jpg 128x128 pixels để thử nghiệm do ảnh này cĩ đường biên mờ.

Sau đây là kết quả của quá trình phân đoạn ảnh berries.jpg với khoảng cách ds = 10: 50: 300 inche và k = 17500:

(a) (b) (c)

(d) (e) (f)

Hình 3.10. Các ảnh mờ (a), (b), (c), (d), (e), (f) được quan sát lần lượt ở khoảng cách 10, 60, 110, 160, 210, 260 inches.

(a) (b) (c)

(d) (e) (f)

Hình 3.11. Các core cluster được hình thành tương ứng với các ảnh từ mức thơ (hình 3.10. (f)) đến mịn dần (hình 3.10 (a)).

Hình 3.12. Kết quả cuối cùng của quá trình phân đoạn trên.

Hồn tồn tương tự, chúng ta cĩ các kết quả phân đoạn sau:

Hình 3.14. Kết quả phân đoạn với k = 10 000 và ds lần lượt là 10: 50 : 200 và 10: 50: 400

3.4. So sánh với giải thuật phân đoạn Edge Flow

Để đánh giá khách quan, chúng ta so sánh kết quả phân đoạn của chương trình do M. Petrou và M. Mirmedhi đề xuất với kết quả đạt được bởi giải thuật phân đoạn khác. Giải thuật phân đoạn mà ta chọn là giải thuật Edge Flow được Wei Ma và Manjunath [24] phát triển. Lý do chúng ta chọn giải thuật này là bởi vì giải thuật Edge Flow là cách tiếp cận hồn tồn khác với giải thuật chúng ta và sử dụng nhiều khái niệm khác. Sử dụng các kết quả mà hai ơng cho, chúng ta thực hiện so sánh với các ảnh hình 3.15.

Kết quả phân đoạn do Kết quả phân đoạn Aûnh gốc (K=10000 M. Petrou và M. Mirmehdi đề xuất theo Edge Flow (adsbygoogle = window.adsbygoogle || []).push({});

K = 50000

Hình 3.15. So sánh các kết quả của hai giải thuật.

Như chúng ta thấy, Edge Flow tìm các biên giữa các vùng trong ảnh rất chính xác đúng như tên gọi của giải thuật. Tuy nhiên, Edge Flow cĩ khuynh hướng phân đoạn quá mức.

3.5. Nhận xét, giải pháp đề xuất

Xem xét hình 3.11, chúng ta nhận thấy các core cluster ở các mức thơ kém chính xác hơn so với các core cluster ở mức mịn hơn. Điều này là do các core cluser ở mức mịn hơn là kết quả của quá trình giãn nở kết hợp thơng tin từ mức thơ trước đĩ và ảnh mờ ở mức hiện tại.

Xem xét các kết quả đạt được hình 3.12 và 3.13, chúng ta thấy kết quả phân đoạn càng chính xác khi số cluster khởi tạo ban đầu K càng lơn. Như vậy, giá trị

Một phần của tài liệu Đánh giá các kết quả đạt được và giải pháp đề xuất (Trang 68)