Biến đổi ảnh sang lớp các số nguyên không dấu 16 bit

Một phần của tài liệu Xây dựng hệ giám sát, điều khiển vi kẹp (Trang 57)

Cú pháp: I2 = im2uint16(I) RGB2 = im2uint16(RGB) I = im2uint16(BW) X2 = im2uint16(X,'indexed') Miêu tả

Hàm im2uint16 biến đổi ảnh đầu vào thành các số nguyên không dấu 16 bit. Nếu ảnh đầu vào thuộc lớp số nguyên không dấu 16 bit (uint16) thì kết quả cho ảnh giống y hệt nó. Nếu ảnh đầu vào thuộc các lớp khác thì kết quả trả về là ảnh tương đương với ảnh thuộc lớp uint16 bằng cách thay đổi lại tỷ lệ, độ dịch cần thiết

Ví dụ:

I = reshape(linspace(0,1,20),[5 4]) I =

Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh 0.0526 0.3158 0.5789 0.8421 0.1053 0.3684 0.6316 0.8947 0.1579 0.4211 0.6842 0.9474 0.2105 0.4737 0.7368 1.0000 I2 = im2uint16(I) I2 = 0 17246 34492 51738 3449 20695 37941 55187 6898 24144 41391 58637 10348 27594 44840 62086 13797 31043 48289 65535 3.2.5. Đọc và ghi dữ liệu ảnh 3.2.5.1. Đọc dữ liệu ảnh từ tệp Cú pháp: A = imread(filename,fmt) [X,map] = imread(filename,fmt) A = imread(filename) Miêu tả

Hàm imread có tác dụng như sau:

A = imread(filename,fmt) đọc một ảnh đa mức xám hoặc ảnh màu từ một tệp trên máy tính. Tên của tệp bao gồm cả đường dẫn (nếu không có đường dẫn thì Matlab tìm file tại thư mục hiện hành) được chỉ ra ở tham số thứ nhất (filename). Tham số thứ hai là một xâu kí tự chỉ ra định dạng của file ảnh. Nếu hàm imread không tìm thấy file được chỉ ra ở phần filename thì nó sẽ tìm file có tên là kết hợp của hai tham số trên filename.fmt

Ví dụ: I = imread(„taykep‟,‟bmp‟); I = imread(„taykep.bmp‟);

Hàm imread trả về dữ liệu ảnh trong mảng I. Nếu file ảnh chứa ảnh đa mức xám thì I là một mảng hai chiều (MxN). Còn nếu file chứa ảnh màu thì I à một mảng ba chiều (MxNx3). Kiểu của các phần tử mảng phụ thuộc vào dữ liệu ảnh được định dạng

Các kiểu format được hỗ trợ

bmp Windown Bitmap (BMP)

1-bit, 4-bit, 8-bit, 16-bit, 24-bit, and 32-bit của các ảnh không nén

cur Windows

Cursor resources (CUR)

1-bit, 4-bit, and 8-bit các ảnh không nén

gif Graphics Interchange

Format (GIF)

Các ảnh 1 bit – 8 bit

hdf Hierarchical Data Format

(HDF)

Các tập dữ liệu mành ảnh 8 bit có thể có hoặc không có sự kết hợp của bản đồ màu và các tập dữ liệu mành ảnh 24 bit

ico Windows

Icon resources (ICO)

1-bit, 4-bit, và 8-bit của các ảnh không nén

jpg hoặc jpeg Joint Photographic Experts Group (JPEG)

Mọi dòng cơ bản của ảnh JPEG

…….

Hầu hết các định dạng file ảnh sử dụng 8 bit để lưu các giá trị điểm ảnh. Và khi các ảnh này được đọc vào trong bộ nhớ Matlab sẽ lưu chúng vào lớp số nguyên không dấu 8 bit (uint8). Với các ảnh hỗ trợ 16 bit dữ liệu như PGN, TIFF, Matlab lưu chúng vào lớp số nguyên không dấu 16 bit (uint16)

3.2.5.2. Ghi dữ liệu ảnh vào tệp

Để ghi dữ liệu ảnh vào tệp ta dùng hàm imwrite của Matlab. Cú pháp:

imwrite(A,filename,fmt) imwrite(X,map,filename,fmt) miêu tả:

Với cú pháp thứ nhất imwrite(A,filename,fmt) ghi dữ liệu ảnh trong mảng A vào trong file được chỉ ra bởi tham số filename và định dạng được chỉ ra bởi tham số fmt.

Mảng A có thể là mảng hai chiều (ảnh đa mức xám) (MxN) hay mảng ba chiều (ảnh màu) (MxNx3) A không thể là một mảng rỗng. Nếu định dạng đưa ra là TIFF thì mảng A có thể là mảng 4 chiều có chứa dữ liệu màu sử dụng không gian màu

Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh

CMYK.

Với cú pháp thứ hai imwrite(X,map,filename,fmt) ghi ảnh chỉ số trong X và kết hợp với bản đồ màu của nó trong map vào trong tệp được chỉ ra bới tham số filename và với định dạng trong tham số fmt.

Những định dạng được hỗ trợ giống trong bảng định dạng của mục đọc dữ liệu ảnh từ tệp.

Dùng hàm imwrite có thể thay đổi định dạng của ảnh thành một định dạng khác (các định dạng phải nằm trong mục các định dạng có thể hỗ trợ cho ảnh)

Ví dụ:

A=imread(„taykep‟,‟bmp‟); imwrite(A,‟taykep‟,‟jpg‟);

Trong ví dụ này ta đọc một file ảnh với định dạng là bmp vào trong mảng A sau đó ghi lại nội dung ảnh đó vào file taykep với định dạng là jpg

Nếu A thuộc lớp uint8 hay uint16 thì imwrite sẽ ghi giá trị đúng chính xác mà không phải hiệu chỉnh. Nếu A thuộc lớp double thì imwrite sẽ hiệu chỉnh giá trị trước khi ghi lại.

3.2.6. Hiển thị và khám phá ảnh 3.2.6.1. Hiển thị ảnh 3.2.6.1. Hiển thị ảnh

Để hiển thị ảnh ta dùng cú pháp sau: Imshow(ima);

Trong đó ima là một biến ảnh. Biến ảnh có thể được đọc vào từ file hay thu nhận ảnh từ thiết bị thu nhận ảnh.

Cú pháp trên Matlab tự động tạo ra một cửa sổ figure để hiển thị ảnh. Nếu đã có một cửa sổ figure được tạo ra thì ảnh ima được hiện trên figure đó và ảnh trên figure đó sẽ bị mất. Để hiển thị đồng thời nhiều ảnh thì ta dùng cú pháp sau:

Figure, imshow(imal); Figure, imshow(imal); Figure, imshow(imal);

Với cú pháp này thì Matlab sẽ tạo ra một figure mới rồi hiển thị ảnh trên cửa sổ figure đó.

Ví dụ:

Moon = imread(„moon.tif‟); Imshow(moon);

Hình 3.10.

3.2.6.2. Khám phá ảnh

Để biết thông tin về giá trị của từng điểm ảnh ta dùng cú pháp sau: imtool(ima);

Với cú pháp trên Matlab sẽ hiển thị ảnh ima trên một cửa sổ imge toool. Từ cửa sổ này ta có thể mở các cửa sổ khác để xem thông tin về ảnh như cửa sổ image Information, Adjust Constrast, pixel Region .

3.2.7.Tính toán ảnh

Tính toán trên ảnh là sự thực hiện đầy đủ các phép tính số học chuẩn như là các phép cộng, trừ, nhân, chia trên ảnh. Tính toán ảnh sử dụng rất nhiều trong xử lý ảnh ngay cả ở bước tiền xử lý đến các bước phức tạp hơn. Ví dụ phép trừ ảnh có thể được sử dụng để phát hiện sự khác biệt giưa hai han hay nhiều ảnh trong một cảnh giống nhau hoặc của một đối tượng.

Ta có thể thực hiện tính toán ảnh sử dụng các toán tử số học của Matlab. Công cụ xử lý ảnh bao gồm một tập các hàm chức năng. Các hàm này thực hiện đầy đủ các phép tính số học trên các kiểu số gồm uint8, uint16, double và trả về kết quả ảnh trong cùng định dạng

3.2.7.1. Các quy tắc làm tròn trong tính toán

Các kết quả của các phép tính số nguyên có thể dễ bị tràn. Ví dụ giá trị cực đại mà một biến thuộc kiểu uint8 có thể lưu là 255. Các phép toán có thể cho kết quả là các phân số không thể lưu trữ trong các mảng số nguyên

Các phép toán của Matlab và các hàm chức năng trong công cụ xử lý ảnh sử dụng các quy tắc sau đây cho tính toán các số nguyên. Các giá trị vượt quá khoảng giá trị của kiểu số nguyên được làm bão hòa đến giá trị cực đại của khoảng. Các phân số được làm tròn. Ví dụ nếu trong kiểu số nguyên không dấu 8 bit (uint8), các giá trị lớn hơn 255 (bao gồm cả vô cùng) được đặt là 255. Bảng dưới đây liệt kê một vài trường hợp làm tròn

Kết quả Kiểu Giá trị được làm tròn

300 Uint8 255

Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh

10.2 Uint8 10

10.5 Uint8 11

3.2.7.2. Kết hợp các lời gọi các hàm tính toán ảnh

Ta có thể kết hợp các hàm tính toán ảnh để tạo ra một chuỗi các hoạt động ví dụ ta tính giá trị trung bình của hai ảnh

I = imread('rice.png');

I2 = imread('cameraman.tif'); K = imdivide(imadd(I,I2), 2);

Tuy nhiên cách làm này được khuyến cáo là không nên dùng vì khi sử dụng dữ liệu thuộc kiểu uint8 hoặc uint16 thì mỗi hàm tính toán sẽ làm tròn và bão hòa các kết quả của nó trước khi gửi tới hàm tính toán tiếp theo. Điều này làm giảm đáng kể đến kết quả tính toán. Trong ví dụ trên ta có thể cải thiện kết quả tính toán bằng cách sử dụng hàm imlincomb. Hàm imlincomb thực hiện kết hợp tuyến tính hai giá trị chính xác và chỉ làm tròn và bão hòa kết quả cuối cùng

Chương 4

THỰC NGHIỆM

4.1. Các phương pháp đo đạc, xử lý số liệu trong thực nghiệm

Chương này trình bày về quá trình thực nghiệm xây dựng hệ giám sát và điều khiển vi kẹp dựa vào công nghệ thị giác máy tính. Sơ đồ khối của hệ thực nghiệm như hình vẽ 4.1 dưới đây.

Hình 4.1: Sơ đồ khối hệ điều khiển vi kẹp

Sơ đồ khối của hệ điều khiển vi kẹp ở trên được đưa ra dựa trên những ý tưởng của việc điều khiển vi kẹp.

Hình 4.2 dưới đây là hệ thống điều khiển, giám sát vi kẹp mà tôi đã xây dựng trong phần thực nghiệm này. Hệ thống này được xây dựng và vận hành thử nghiệm tại viện quốc tế về khoa học vật liệu ITIMS và có kết quả tương đối ổn định.

Trong hệ thống thực nghiệm này gồm có các thiết bị: Một máy ảnh Canon G2 4.0 Mega pixels làm thiết bị thu nhận ảnh. Tín hiệu ra của máy ảnh lấy tại đầu ra A/V out là tín hiệu tương tự. Tín hiệu này được đưa qua một USB TV BOX để biến đổi thành tín hiệu số trước khi đưa vào máy tính xử lý. Máy tính được sử dụng trong hệ thực nghiệm là máy tính xách tay DELL INSPIRON 510m (Yêu cầu máy tính phải có đầy đủ cả hai cổng ghép nối là cổng LPT và cổng COM).

PC

CAMERA

Kính hiển vi

Vi kẹp

Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm

Hình 4.2 Hệ thống điều khiển vi kẹp

4.1.1. Khảo sát chuyển động của vi kẹp

Để khảo sát sự chuyển động của vi kẹp bằng thị giác máy tính thì việc đầu tiên là thu nhận ảnh của đầu vi kẹp. Ảnh thu được từ thiết bị thu nhận ảnh là ảnh màu. Ta sử dụng các công cụ sẵn có của Matlab để biến đổi ảnh màu đó về ảnh đa mức xám, dùng hàm lấy biên ảnh để chuyển đổi ảnh đa mức xám về ảnh chỉ số. Các ảnh như hình dưới đây.

Hình 4. 3. (a) Ảnh gốc (b). Ảnh sau khi lấy biên

Để xác định được khoảng chuyển động của tay kẹp ta phải tính được khoảng cách giữa hai đầu tay kẹp sau mỗi lần ra lệnh đóng hay mở kẹp. Khoảng cách của hai

đầu vi kẹp ta coi chính là khoảng cách của hai mép trong của tay kẹp (tính theo đơn vị pixel).

Hình 4.4 Khoảng cách giữa hai đầu vi kẹp là L

Do cấu tạo của tay kẹp mà phần giữa của tay vi kẹp biên của nó không được thẳng. Tuy nhiên do đặc tính của thuật toán xử lý ảnh (sẽ được trình bày dưới đây) ta chỉ quan tâm đến phần dưới của vi kẹp vì vi kẹp chỉ kẹp vật ở phần dưới.

4.1.1.1. Các thuật toán để tìm L

Gọi L là khoảng cách giữa hai mép trong của vi kẹp. Để tìm được L ta phải tìm hai điểm có đánh dấu + trên hai cánh tay của vi kẹp.

Một nhận xét là một ảnh I có kích thước là x,y (x là số dòng ,y là số cột) thì mỗi phần tử của ảnh có thể truy cập tương tự như các phần tử của một ma trận ví dụ như I(x1,y1). Các ảnh chỉ số cụ thể là ảnh chứa biên của vi kẹp ở trên thì các phần tử của ảnh có giá trị là 1 tại các điểm thuộc đường biên của vi kẹp còn các điểm khác (thuộc nền đen) có giá trị là 0.

Như vậy nhìn vào ảnh ở trên ta thấy để tìm được hai điểm có dấu + ta có thể thực hiện phương pháp quét lùi

Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm

a) Thuật toán quét lùi

Thuật toán quét lùi này tương đối đơn giản. Đầu tiên xuất phát từ điểm có tọa độ là (Xmax,0) tăng dần giá trị của cột từ giá trị 0 đến giá trị cực đại. Sau mỗi lần tăng ta so sánh giá trị của điểm I (Xi,Yj) với 1. Nếu giá trị tại điểm I có giá trị bằng 1 có nghĩa là điểm ảnh đó thuộc đường biên. Ghi nhớ tạo độ điểm này lại và duyệt tiếp. Nếu giá trị tại điểm I đó có giá trị bằng 0 thì tiếp tục tăng giá trị chỉ số cột lên một. Giá trị chỉ số cột tăng đến giá trị cực đại Ymax mà vẫn chưa tìm đủ 4 điểm thuộc đường biên thì ta quay về phía bên trái giảm chỉ số dòng đi 1 đơn vị và lại cho chỉ số cột tăng từ 0 đến giá trị cực đại Ymax. Cứ như thế ta sẽ tìm được một dòng nào đó chứa cả 4 điểm thuộc biên của vi kẹp.

Để ý thấy rằng hai đầu của vi kẹp không cùng nằm trên một đường thẳng nằm ngang mà tay kẹp bên phải cao hơn tay kẹp bên trái. Do đó nếu ta chỉ tìm thấy có hai điểm biên trên một dòng thì có nghĩa là hai điểm biên đó chỉ thuộc một bên của vi kẹp và ta vẫn phải giảm số dòng đi một để tìm trên các dòng khác.

Sau khi tìm được 4 điểm thuộc biên của vi kẹp trên cùng một dòng, tọa độ cột của các điểm đó được giữ bởi một mảng P(1..4) và khoảng cách giữa hai đầu vi kẹp được tính là P(3) – P(2).

Hình 4.6 Lưu đồ thuật toán quét lùi

Begin [x,y] = size(ima) i=x k=k+1; P(k)=j; ima(i,j)=1 j=j+1; j<y i=i-1 j=1; k=0;P(1:4)=0 k=4 i>0 L=P(3)- P(2) End T T T F F F T

Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm

Hình 4.7. Các tọa độ cần xác định của ảnh

Với thuật toán trên mục đích cuối cùng của chúng ta là đi tìm 4 điểm nằm trên đường biên. Nếu đường biên trơn tru không „bị vỡ‟ thì ta luôn luôn tìm được 4 điểm trong đó 2 điểm thuộc cánh tay kẹp bên trái và 2 điểm thuộc cánh tay kẹp bên phải. Tuy nhiên nếu gặp trường hợp đường biên không được như ý muốn như hình dưới đây thì thuật toán này sẽ tìm được 4 điểm thuộc biên nhưng chỉ ở một cánh tay của vi kẹp.

Hình 4.8 Ảnh phóng to của một bên kẹp khi đường biên không trơn

Như vậy công thức tính khoảng cách L không còn được đúng nữa. Ở đây không phải là do thuật toán bị sai mà là do chất lượng của ảnh thu được bị bóng hay nhòe, khiến cho việc khắc phục làm trơn ảnh là không thể được

Mặt khác thuật toán này có một nhược điểm là nếu gặp ảnh lớn thì số lần lặp sẽ là lớn dẫn đến việc không đáp ứng được thời gian thực. Có thể cải thiện thuật toán này bằng cách là không phải ở dòng nào ta cũng quét mà ta cho cách n dòng lại quét

một dòng. Như vậy thì số lần lặp sẽ giảm đi n lần, nhưng cũng phạm phải một sai số là n dòng.

Một thuật toán khác được tìm hiểu và đưa ra để cải thiện nhằm giảm bớt số lần lặp dẫn đến giảm thời gian xử lý.

b) Thuật toán quét trái phải

Thuật toán này xuất phát từ nhận xét là sự chuyển động của tay kẹp chỉ trong một phạm vi nhất định vì thế mà các tọa độ đã tìm được trong một lần duyệt sẽ thay đổi rất ít so với vị trí trước. Vì thế mà ta căn cứ vào điểm trước đó để tìm ra điểm hiện tại. Ta xuất phát từ trung điểm của hai điểm đã xác định từ lần trước ta quét về bên trái nếu gặp được biên của vi kẹp thì duyệt tiếp sang bên phải nếu cũng tìm được biên của vi kẹp thì hai điểm đó chính là hai điểm ta cần tìm. Nếu quét sang trái hoặc sang phải mà không tìm thấy biên thì giảm dòng đi 1 đơn vị và tiếp tục quay lại quét. Như vậy thì khoảng cách L sẽ được tính là tọa độ cột của điểm bên phải trừ đi tọa độ cột của điểm bên trái.

4.1.1.2. Kết quả mô phỏng các thuật toán

a) Kết quả khảo sát của thuật toán quét trái phải

Hình dưới đây là kết quả mô phỏng thuật toán quét trái phải. Nhìn vào kết quả khảo sát ta thấy lần khảo sát thứ nhất số lần lặp tương đối là lớn 17494, vì lần đầu tiên ta chưa xác định được hai điểm cần tìm của hai đầu vi kẹp. Sau khi đã tìm được hai

Một phần của tài liệu Xây dựng hệ giám sát, điều khiển vi kẹp (Trang 57)