Mục lục:

Tạo nhãn cầu Đơn thuốc cho nhãn cầu của bạn: Dự án BME60B: 9 bước
Tạo nhãn cầu Đơn thuốc cho nhãn cầu của bạn: Dự án BME60B: 9 bước

Video: Tạo nhãn cầu Đơn thuốc cho nhãn cầu của bạn: Dự án BME60B: 9 bước

Video: Tạo nhãn cầu Đơn thuốc cho nhãn cầu của bạn: Dự án BME60B: 9 bước
Video: Sử dụng Corticoid trong điều trị nhiễm khuẩn bề mặt nhãn cầu | Bài giảng bệnh học nhãn khoa 2024, Tháng mười một
Anonim
Eyeballing Toa thuốc cho nhãn cầu của bạn: Dự án BME60B
Eyeballing Toa thuốc cho nhãn cầu của bạn: Dự án BME60B

Bởi: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste

Độ phóng đại là một trong những tính năng chính hiện nay của kính đọc sách, được phân loại theo đơn vị đi-ốp của chúng. Theo Đại học Công nghệ Michigan, một diopter là độ dài tiêu cự của ống kính, thường được đo bằng mm, đơn vị đo là mét (Đại học Công nghệ Michigan). Bởi vì kính đọc sách có thấu kính lồi, độ dài tiêu cự sẽ dương, làm cho đi-ốp cũng dương (HyperPhysics). Độ dài tiêu cự tăng lên khi khoảng cách giữa đối tượng càng xa ống kính thực tế, và điều này dẫn đến đi-ốp giảm vì chúng tỷ lệ nghịch. Do đó, việc trang bị kính đọc sách có gắn thêm đi-ốp sẽ giúp ống kính phóng to tầm nhìn để có vẻ như độ dài tiêu cự nhỏ hơn bằng cách tăng giá trị của đi-ốp.

Đoạn mã được trình bày sẽ được sử dụng để dự đoán độ đip của một thấu kính có đơn thuốc không xác định. Hai đầu vào được sử dụng để tính toán đơn thuốc: một bức ảnh chụp phông nền được kiểm soát mà không sử dụng bất kỳ ống kính nào và một bức ảnh khác có cùng phông nền nhưng thông qua ống kính được lựa chọn. Chương trình sẽ đo độ méo giữa hai bức ảnh này. Từ đó, chúng tôi sẽ có thể ước tính độ diop của ống kính và đưa ra kết quả cho người dùng xem.

Đối với Có thể hướng dẫn này, bạn sẽ cần:

  • Mẫu bàn cờ đen trắng được in trên tờ giấy 11x8.5
  • Máy ảnh có khả năng khóa lấy nét
  • Giá ba chân hoặc thứ gì đó tương tự để bảo vệ máy ảnh
  • Các đơn thuốc khác nhau của kính đọc sách
  • MATLAB

Bước 1: Chụp ảnh

Chụp ảnh
Chụp ảnh
Chụp ảnh
Chụp ảnh
Chụp ảnh
Chụp ảnh

Để tính toán độ phóng đại của ống kính, bạn cần phải so sánh nó với kích thước thực của vật thể. Đối với dự án này, chúng tôi sẽ so sánh một hình ảnh phóng đại với một hình ảnh điều khiển.

Vì vậy, bước đầu tiên là chụp hai bức ảnh của cùng một hình ảnh - bức ảnh đầu tiên chỉ qua máy ảnh và bức ảnh thứ hai qua thấu kính của kính đọc mà bạn muốn kiểm tra.

Bạn sẽ chụp ảnh bàn cờ đen trắng 8,5x11in với lưới 1in. Thiết lập máy ảnh của bạn cách bàn cờ 11 inch. Trước khi chụp ảnh, hãy khóa tiêu điểm trên bàn cờ.

Chụp ảnh bàn cờ mà không cần kính đọc sách. Sau đó, không di chuyển bất cứ thứ gì, hãy đặt kính đọc sách trước máy ảnh và chụp bức ảnh thứ hai.

Đảm bảo rằng vị trí của máy ảnh không di chuyển giữa các lần chụp. Điều duy nhất nên thay đổi giữa hai bức ảnh là sự hiện diện của thấu kính kính ở phía trước máy ảnh.

Khi bạn hoàn thành các bức ảnh, hãy tải chúng lên máy tính của bạn.

Bước 2: Tải hình ảnh vào MATLAB

Tải hình ảnh vào MATLAB
Tải hình ảnh vào MATLAB

Mở một tập lệnh mới.

Đầu tiên, chỉ định thư mục lưu trữ ảnh. Sau đó, sử dụng chức năng dir để trích xuất hình ảnh-j.webp

Dir = 'C: / Users / kuras / Desktop / class / SQ2 / BME60b / Sandbox / testphotos'; GetDir = dir ('*. Jpg');

Đối với dự án của chúng tôi, chúng tôi muốn nhắc người dùng chương trình về những tệp họ muốn so sánh. Phần đầu tiên yêu cầu người dùng chỉ định hình ảnh điều khiển và phần thứ hai yêu cầu người dùng chỉ định hình ảnh kiểm tra.

  • % Hỏi người dùng tệp nào là hình ảnh điều khiển.
  • Control = input ('# of control image. / N');
  • ControlFile = [GetDir (Control).name]
  • Hỏi người dùng tệp nào là hình ảnh mà họ muốn phân tích.
  • ChooseFile = input ('\ n # hình ảnh bạn muốn phân tích. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

Bước 3: Phân tích hình ảnh

Phân tích hình ảnh
Phân tích hình ảnh
Phân tích hình ảnh
Phân tích hình ảnh

Hình ảnh màu trong MATLAB có kích thước MxNx3, trong khi hình ảnh thang độ xám là MxN. Điều này có nghĩa là việc nâng cao / chỉnh sửa hình ảnh thang độ xám sẽ nhanh hơn vì có ít dữ liệu hơn để theo dõi. Sử dụng rgb2gray để chuyển đổi hình ảnh sang thang độ xám. (Chức năng imrotate đã được sử dụng vì ảnh của chúng tôi nằm ngang - dòng mã này có thể cần thiết hoặc có thể không cần thiết trong phiên bản của bạn.)

  • % chuyển đổi sang thang độ xám và xoay
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotate (I, 90);

Tiếp theo, hiển thị hình ảnh. Chức năng subplot được sử dụng để hình ảnh kiểm tra sẽ có thể ở bên cạnh điều khiển trong các bước sau.

  • %trưng bày
  • Hình 1);
  • subplot (1, 2, 1)
  • imshow (tôi);
  • tiêu đề (ControlFile);

Sử dụng imcrop để nhắc người dùng cắt bàn cờ ra khỏi hình ảnh đầy đủ. Đoạn mã sau cũng hiển thị một hộp thông báo để cung cấp hướng dẫn cho người dùng.

  • % cắt ra bảng kiểm tra để phân tích
  • waitfor (msgbox ({'Sử dụng các sợi nhỏ để cắt ra bàn cờ.', 'Sau đó nhấp đúp vào vùng quan tâm.'}));
  • I_crop = imcrop (I);

Sử dụng mã hóa để mã hóa hình ảnh.

I_binary = precision (I_crop);

Bước 4: Tính chiều rộng của ô trắng trên bàn cờ

Tính chiều rộng của ô trắng trên bàn cờ
Tính chiều rộng của ô trắng trên bàn cờ
Tính chiều rộng của ô trắng trên bàn cờ
Tính chiều rộng của ô trắng trên bàn cờ
Tính chiều rộng của ô trắng trên bàn cờ
Tính chiều rộng của ô trắng trên bàn cờ

Tiếp theo, nhắc người dùng vẽ một đường ngang qua hình ảnh bằng cách sử dụng imline. Dòng này phải chạy theo chiều ngang trên bàn cờ. Nó phải bắt đầu và kết thúc trên một hình vuông màu đen (không quan trọng ở đâu) - điều này là do chúng tôi sẽ đo chiều rộng của các hình vuông màu trắng, không phải các hình vuông màu đen.

  • %vẽ đường thẳng
  • Hình 1)
  • subplot (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Nhấp và kéo để vẽ đường kéo dài 9 ô, từ khoảng đen đến khoảng đen.', 'Nhấp đúp để xác nhận.'}));
  • dòng = imline;
  • vị trí = đợi (dòng);
  • endpoints = line.getPosition;

Trích xuất các coodinates X và Y cho các điểm cuối của đoạn thẳng đã vẽ.

  • X = điểm cuối (:, 1)
  • Y = endpoints (:, 2);

Sử dụng ứng biến để tạo biểu đồ dựa trên cường độ được tìm thấy dọc theo đường vẽ. Điều này sẽ giống như một làn sóng vuông từ 0 (đen) đến 1 (trắng). Tính toán các đỉnh và cả vị trí của chúng.

  • Hình 2)
  • subplot (1, 2, 1)
  • title ('Cường độ hình ảnh trên dòng ngẫu hứng (Điều khiển)')
  • ngẫu hứng (I_binary, X, Y); lưới điện trên;
  • [~, ~, c1, ~, ~] = randomfile (I_binary, X, Y);
  • [peak, loc] = findpeaks (c1 (:,:, 1));
  • Giữ lấy
  • plot (loc, peak, 'ro');
  • giữ lại

Tìm độ dài của mỗi bình nguyên trên đồ thị ứng biến bằng cách sử dụng vòng lặp for. Chạy vòng lặp for cho cùng một lượng đỉnh có trong biểu đồ ứng suất. Để tính chiều dài của mỗi bình nguyên, hãy sử dụng chức năng ‘find’ để tìm tất cả các vị trí có giá trị cường độ ‘1’ thay vì ‘0’. Sau đó, tính chiều dài của mảng đó để có tổng chiều dài của bình nguyên, chiều dài này sẽ bằng chiều rộng của hình vuông màu trắng tính bằng pixel. ControlPlateauList = zeros (1, length (loc));

for i = 1: length (loc)

nếu tôi == chiều dài (loc)

cao nguyên = find (c1 (loc (i): end,:, 1));

khác

cao nguyên = find (c1 (loc (i): loc (i + 1) -1,:, 1));

kết thúc

ControlPlateauList (i) = length (bình nguyên);

kết thúc

Bước 5: Lặp lại các Bước 3 và 4 cho Hình ảnh Kiểm tra

Lặp lại các Bước 3 và 4 cho Hình ảnh Kiểm tra
Lặp lại các Bước 3 và 4 cho Hình ảnh Kiểm tra

* Lưu ý: khi vẽ đường ngẫu hứng trên hình ảnh kiểm tra, hãy nhớ vẽ nó ngang qua các ô vuông tương ứng với đường bạn đã vẽ trên hình ảnh đối chứng.

Bước 6: Tính độ phóng đại của thấu kính

Tính độ phóng đại của thấu kính
Tính độ phóng đại của thấu kính

Các phép đo phóng đại được tính bằng cách chia giá trị trung bình của chiều dài bình nguyên, được tính ở bước 5, cho trung bình của chiều dài bình nguyên đối chứng, được tính ở bước 4. Giá trị này được tính là 1,0884.

độ phóng đại = trung bình (danh sách cao nguyên) / trung bình (ControlPlateauList);

Bước 7: Tìm bình phương R và đơn thuốc của người dùng thông qua phép nội suy

Tìm bình phương R và đơn thuốc của người dùng thông qua phép nội suy
Tìm bình phương R và đơn thuốc của người dùng thông qua phép nội suy

Sử dụng mã:

  • md1 = fitlm (GivenPrescription, MagArray);
  • Rsquared = md1. Rsquared. Ordinary;

Chúng ta có thể tìm giá trị bình phương R của biểu đồ GivenPresciption (các giá trị đã cho của ống kính của chúng tôi) so với MagArray (một mảng các tỷ lệ đo độ phóng đại mà chúng tôi đã tính toán trước đó). Bằng cách có giá trị bình phương R đủ cao, có thể suy ra rằng có một mối tương quan đủ mạnh để biện minh cho việc sử dụng phương pháp này. Đối với trường hợp cụ thể này, giá trị bình phương R là 0,9912, điều này cho thấy mối tương quan chặt chẽ và do đó được chứng minh khi sử dụng phương pháp này trong phân tích.

Sử dụng chức năng:

Toa = interp1 (MagArray, GivenPrescription, phóng đại, 'tuyến tính');

Chúng tôi có thể nội suy giá trị đơn thuốc tương ứng (trên trục x) của tỷ lệ phóng đại (một giá trị trên trục y) và tìm đơn thuốc của người dùng.

Việc nội suy dữ liệu là quan trọng để phương pháp này hoạt động vì nó cho phép chúng ta đưa ra các giả định về thông tin chúng ta không có, dựa trên thông tin chúng ta có. Mặc dù một dòng phù hợp nhất về mặt kỹ thuật sẽ là một ứng cử viên mạnh mẽ hơn cho giả định này, nhưng việc tạo ra ranh giới để giảm số lượng đầu ra phục vụ hiệu quả tương tự như kính thuốc dù sao cũng có giá trị đồng nhất gia tăng. Điều này được giải thích trong các bước sau.

Bước 8: Hiển thị Đơn thuốc của Người dùng trên Biểu đồ

Hiển thị Đơn thuốc của Người dùng trên Biểu đồ
Hiển thị Đơn thuốc của Người dùng trên Biểu đồ

Sử dụng mã sau:

  • nhân vật;
  • cốt truyện (GivenPrescription, MagArray, '-g')
  • Giữ lấy
  • âm mưu (Kê đơn, độ phóng đại, 'bp')
  • giữ lại
  • lưới
  • chú giải ('Dữ liệu', 'Điểm nội suy', 'Vị trí', 'NW')

Chúng tôi có thể vẽ biểu đồ cho thấy Tỷ lệ độ phóng đại so với Đơn thuốc đã cho bằng đường màu xanh lá cây và dữ liệu tìm thấy về độ phóng đại được tính toán của chúng tôi so với đơn thuốc nội suy của chúng tôi bằng một ngôi sao màu xanh lam. Sau đó, chú giải gắn nhãn tiêu đề, trục x và trục y và đặt chú giải ở góc trên cùng bên trái.

Bước 9: Thu hẹp đơn thuốc của bạn

Thu hẹp đơn thuốc của bạn
Thu hẹp đơn thuốc của bạn

Mã sau được sử dụng để làm tròn cho đơn thuốc:

  • nếu Đơn thuốc <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Đơn thuốc <= 1.375

    CalculatedPrescription = '1,25';

  • elseif Đơn thuốc <= 1.625

    CalculatedPrescription = '1,5';

  • elseif Đơn thuốc <= 1.875

    CalculatedPrescription = '1,75';

  • elseif Đơn thuốc <= 2,25

    CalculatedPrescription = '2.0';

  • elseif Đơn thuốc <= 2.625

    CalculatedPrescription = '2,5';

  • elseif Đơn thuốc <= 3

    CalculatedPrescription = '2,75';

  • elseif Đơn thuốc <= 3.375

    CalculatedPrescription = '3,25';

  • khác

    CalculatedPrescription = 'chưa biết';

  • kết thúc

Đơn thuốc được tìm thấy thông qua phép nội suy không nhất thiết phản ánh đơn thuốc thực tế - điều này là do sẽ luôn có những thay đổi nhỏ trong việc phân tích bức ảnh do lỗi của con người. Như vậy, chúng ta cần bước này để phân loại đơn thuốc thực tế.

Các đơn thuốc được kê thường bắt đầu từ 1,0 diop và tăng thêm 0,25 trong đơn thuốc của họ, vì vậy sau khi tính toán đơn thuốc, chúng tôi muốn xác định đơn thuốc phù hợp nhất với những gì người dùng có thể cần. Sau khi tính toán đơn thuốc, chúng tôi chạy nó qua các câu lệnh If đã cho để kiểm tra giá trị của nó và xác định đơn thuốc nào là cần thiết. Bất cứ giá trị nào nhỏ hơn hoặc bằng 1,125 thì đơn thuốc là 1,0. Bất cứ điều gì nhỏ hơn hoặc bằng 1,375, đơn thuốc là 1,25. Bất cứ điều gì nhỏ hơn hoặc bằng 1,625, đơn thuốc là 1,5. Bất cứ điều gì nhỏ hơn hoặc bằng 1.845, đơn thuốc là 1.75. Và như thế.

Chúng tôi có các giá trị tăng lên vì chúng tôi đang kiểm tra xem các giá trị có nhỏ hơn không. Nếu chúng ta đã giảm các giá trị thì câu lệnh if đầu tiên sẽ đọc câu lệnh if đầu tiên mọi lúc. Nếu đơn thuốc là nhỏ nhất, chúng tôi muốn nó nhận ra nó là nhỏ nhất ngay lập tức, đó là lý do tại sao giá trị nhỏ nhất là giá trị mà chúng tôi bắt đầu. Bất kỳ điều gì cao hơn giá trị cao nhất có nghĩa là đơn thuốc không nằm trong phạm vi dữ liệu của chúng tôi, vì vậy nó sẽ cung cấp giá trị chuỗi "Không xác định".

Đề xuất: