Სარჩევი:

Eyeballing Your Eyeball's prescription: BME60B პროექტი: 9 ნაბიჯი
Eyeballing Your Eyeball's prescription: BME60B პროექტი: 9 ნაბიჯი

ვიდეო: Eyeballing Your Eyeball's prescription: BME60B პროექტი: 9 ნაბიჯი

ვიდეო: Eyeballing Your Eyeball's prescription: BME60B პროექტი: 9 ნაბიჯი
ვიდეო: Smokin Aces Kid 2024, ივლისი
Anonim
Eyeballing Your Eyeball's prescription: BME60B პროექტი
Eyeballing Your Eyeball's prescription: BME60B პროექტი

ავტორები: ჰანა სილოსი, სანგ ჰი კიმი, თომას ვასკესი, პატრიკ ვისტი

გადიდება არის კითხვის სათვალეების ერთ -ერთი მთავარი მახასიათებელი, რომელიც კლასიფიცირდება დიოპტერების დანიშნულებით. მიჩიგანის ტექნოლოგიური უნივერსიტეტის თანახმად, დიოპტერი არის ობიექტივის კეროვანი სიგრძე, ჩვეულებრივ იზომება მმ -ით, მეტრის ერთეულში (მიჩიგანის ტექნოლოგიური უნივერსიტეტი). იმის გამო, რომ კითხვის სათვალეებს აქვს ამოზნექილი ლინზები, ფოკუსური მანძილი იქნება დადებითი, რაც იწვევს დიოპტერების პოზიტიურსაც (ჰიპერფიზიკა). ფოკუსური მანძილი იზრდება, როდესაც ობიექტს შორის მანძილი უფრო შორდება ფაქტობრივ ობიექტივს და ეს იწვევს დიოპტერების შემცირებას, ვინაიდან ისინი უკუპროპორციულია. ამრიგად, კითხვის სათვალე დამატებითი დიოპტერებით დაეხმარება ობიექტივს გაადიდოს ხედი ისე, რომ როგორც ჩანს, ფოკუსური მანძილი ნაკლებია დიოპტერების მნიშვნელობის გაზრდით.

წარმოდგენილი კოდი გამოყენებული იქნება ლინზების დიოპტრის პროგნოზირებისთვის უცნობი რეცეპტით. ორი შეყვანა გამოიყენება რეცეპტის გამოსათვლელად: კონტროლირებადი ფონის ფოტოსურათი ყოველგვარი ლინზების გამოყენების გარეშე, და იმავე ფოტოს სხვა ფოტო, მაგრამ არჩევანის ობიექტივიდან. პროგრამა გაზომავს დამახინჯებას ამ ორ ფოტოს შორის. იქიდან ჩვენ შევძლებთ ობიექტივის დიოპტრის შეფასებას და მომხმარებლისთვის შედეგის წარმოქმნას.

ამ ინსტრუქციისთვის დაგჭირდებათ:

  • შავ-თეთრი checkerboard ნიმუში იბეჭდება 11x8.5 ფურცელზე
  • კამერა მისი ფოკუსის ჩაკეტვის უნარით
  • შტატივი, ან რამე მსგავსი კამერის დასაცავად
  • კითხვის სათვალეების სხვადასხვა რეცეპტი
  • MATLAB

ნაბიჯი 1: გადაიღეთ ფოტოები

Სურათების გადაღება
Სურათების გადაღება
Სურათების გადაღება
Სურათების გადაღება
Სურათების გადაღება
Სურათების გადაღება

ობიექტივის გადიდების გამოსათვლელად, თქვენ უნდა შეგეძლოთ მისი შედარება ობიექტის რეალურ ზომასთან. ამ პროექტისთვის ჩვენ შევადარებთ გადიდებულ სურათს საკონტროლო სურათთან.

ამრიგად, პირველი ნაბიჯი არის ერთი სურათის ორი ფოტოს გადაღება - პირველი მხოლოდ კამერის საშუალებით, ხოლო მეორე კითხვის სათვალის ობიექტივიდან, რომლის გამოცდაც გსურთ.

თქვენ გადაიღებთ 8.5x11in შავ -თეთრ გამშვებ დაფას 1 ინ ბადესთან ერთად. დააყენეთ კამერა გამშვები დაფისგან 11 მანძილზე. ფოტოების გადაღებამდე ჩაკეტეთ აქცენტი დაფაზე.

გადაიღეთ ჩამრთველი დაფა კითხვის სათვალეების გარეშე. შემდეგ, არაფრის გადაადგილების გარეშე, განათავსეთ კითხვის სათვალე კამერის წინ და გადაიღეთ მეორე ფოტო.

დარწმუნდით, რომ კამერის პოზიცია არ გადავა კადრებს შორის. ერთადერთი, რაც უნდა შეიცვალოს ორ ფოტოს შორის არის სათვალის ლინზის არსებობა კამერის წინ.

როდესაც დაასრულებთ ფოტოებს, ატვირთეთ ისინი თქვენს კომპიუტერში.

ნაბიჯი 2: ჩატვირთეთ სურათები MATLAB– ში

ჩატვირთეთ სურათები MATLAB– ში
ჩატვირთეთ სურათები MATLAB– ში

გახსენით ახალი სკრიპტი.

პირველი, მიუთითეთ დირექტორია, სადაც ინახება ფოტოები. შემდეგ გამოიყენეთ dir ფუნქცია-j.webp

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

ჩვენი პროექტისთვის, ჩვენ გვსურდა ვკითხოთ პროგრამის მომხმარებელს, თუ რომელი ფაილების შედარება სურდათ. პირველი ნაწილი სთხოვს მომხმარებელს განსაზღვროს საკონტროლო სურათი, ხოლო მეორე სთხოვს მომხმარებელს მიუთითოს ტესტის სურათი.

  • %ჰკითხეთ მომხმარებელს რომელი ფაილია საკონტროლო სურათი.
  • კონტროლი = შეყვანა ('# საკონტროლო სურათის. / N');
  • ControlFile = [GetDir (კონტროლი). სახელი]
  • %ჰკითხეთ მომხმარებელს, რომელი ფაილია ის სურათი, რომლის გაანალიზებაც სურთ.
  • ChooseFile = შეყვანა ('\ n# სურათი, რომლის ანალიზი გსურთ. / N');
  • PrescripFile = [GetDir (ChooseFile). სახელი];

ნაბიჯი 3: სურათის ანალიზი

სურათის ანალიზი
სურათის ანალიზი
სურათის ანალიზი
სურათის ანალიზი

ფერადი სურათი MATLAB– ში არის MxNx3 ზომის, ხოლო ნაცრისფერი მასშტაბის გამოსახულება არის MxN. ეს ნიშნავს რომ ნაცრისფერი მასშტაბის გამოსახულების გაძლიერება/რედაქტირება უფრო სწრაფია, რადგან თვალყურის დევნება ნაკლები მონაცემებია. გამოიყენეთ rgb2gray გამოსახულების ნაცრისფერ მასშტაბად გადასაყვანად. (იმროტაციის ფუნქცია გამოიყენეს, რადგან ჩვენი ფოტოები შემოვიდა ჰორიზონტალურად - კოდის ეს ხაზი შეიძლება იყოს ან არ იყოს საჭირო თქვენს ვერსიაში.)

  • %გადააკეთეთ ნაცრისფერში და ბრუნეთ
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotate (I, 90);

შემდეგი, აჩვენეთ სურათი. ქვემეხი ფუნქცია გამოიყენება ისე, რომ შემდგომ ნაბიჯებში ტესტის გამოსახულება იქნება კონტროლის გვერდით.

  • %ჩვენება
  • ფიგურა 1);
  • ქვეპლოტი (1, 2, 1)
  • imshow (I);
  • სათაური (ControlFile);

გამოიყენეთ imcrop, რათა მომხმარებელს სთხოვოს ამოჭრას checkerboard სრული სურათიდან. შემდეგი კოდი ასევე აჩვენებს შეტყობინებების ყუთს მომხმარებლისთვის მითითებების მისაცემად.

  • ამოიღეთ checkerboard ანალიზისთვის
  • waitfor (msgbox ({'გამოიყენეთ ჯვარედინი თმები საჭრელი დაფის მოსაკრეფად.', 'შემდეგ ორჯერ დააწკაპუნეთ ინტერესის არეზე.'}));
  • I_crop = imcrop (I);

გამოიყენეთ imbinarize გამოსახულების ბინარიზაციისთვის.

I_binary = imbinarize (I_crop);

ნაბიჯი 4: გამოთვალეთ თეთრი კვადრატების სიგანე დაფაზე

გამოთვალეთ დაფის თეთრი კვადრატების სიგანე
გამოთვალეთ დაფის თეთრი კვადრატების სიგანე
გამოთვალეთ დაფის თეთრი კვადრატების სიგანე
გამოთვალეთ დაფის თეთრი კვადრატების სიგანე
გამოთვალეთ დაფის თეთრი კვადრატების სიგანე
გამოთვალეთ დაფის თეთრი კვადრატების სიგანე

შემდეგი, უთხარით მომხმარებელს, რომ გამოსახოს ხაზი imline– ის გამოყენებით. ეს ხაზი უნდა იყოს ჰორიზონტალურად გამშვები დაფის გასწვრივ. ის უნდა დაიწყოს და დასრულდეს შავ კვადრატზე (არ აქვს მნიშვნელობა სად)- ეს იმიტომ ხდება, რომ ჩვენ გავზომოთ თეთრი კვადრატების სიგანე და არა შავი.

  • %დახაზეთ ხაზი
  • ფიგურა 1)
  • ქვეპლოტი (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'დააწკაპუნეთ და გადაიტანეთ ხაზის გასავლელად 9 ყუთში, შავი სივრციდან შავ სივრცეში.', 'ორმაგი დაწკაპუნება დასადასტურებლად.'}));
  • ხაზი = იმლინი;
  • პოზიცია = ლოდინი (ხაზი);
  • ბოლო წერტილები = line.getPosition;

ამოიღეთ X და Y კუდინატები დახატული ხაზის ბოლო წერტილებისთვის.

  • X = საბოლოო წერტილები (:, 1)
  • Y = საბოლოო წერტილები (:, 2);

გამოიყენეთ improfile გრაფიკის შესაქმნელად დახატული ხაზის გასწვრივ ნაპოვნი ინტენსივობების საფუძველზე. ეს უნდა დაემსგავსოს კვადრატულ ტალღას 0 -დან (შავი) 1 -მდე (თეთრი). გამოთვალეთ მწვერვალები და მათი მდებარეობაც.

  • ფიგურა (2)
  • ქვეპლოტი (1, 2, 1)
  • სათაური ('სურათის ინტენსივობა იმპროფილირებული ხაზის გასწვრივ (კონტროლი)')
  • იმპროფილი (I_binary, X, Y); ბადე ჩართულია;
  • [~, ~, c1,, ~] = იმპროფილი (I_binary, X, Y);
  • [მწვერვალები, ლოკი] = პოვნის მწვერვალები (c1 (:,:, 1));
  • შეჩერდი
  • ნაკვეთი (ლოკი, მწვერვალები, 'რო');
  • თავი დაანებე

იპოვნეთ თითოეული პლატოს სიგრძე იმპროფილურ გრაფიკზე for მარყუჟის გამოყენებით. გაუშვით მარყუჟი იმდენივე მწვერვალისთვის, რაც არის იმპროფილ გრაფიკში. თითოეული პლატოს სიგრძის გამოსათვლელად გამოიყენეთ ფუნქცია "პოვნა", რათა იპოვოთ ყველა ადგილი, სადაც არის "1" ნაცვლად "0" ინტენსივობის მნიშვნელობისა. შემდეგ, გამოთვალეთ ამ მასივის სიგრძე, რათა მიიღოთ პლატოს მთლიანი სიგრძე, რომელიც უნდა იყოს ტოლი თეთრი კვადრატის სიგანე პიქსელებში. ControlPlateauList = ნულოვანი (1, სიგრძე (ლოკ));

for i = 1: სიგრძე (ლოკ)

თუ მე == სიგრძე (ლოკ)

პლატო = იპოვე (c1 (loc (i): დასასრული,:, 1));

სხვა

პლატო = იპოვე (c1 (loc (i): loc (i+1) -1,:, 1));

დასასრული

ControlPlateauList (i) = სიგრძე (პლატო);

დასასრული

ნაბიჯი 5: გაიმეორეთ ნაბიჯები 3 და 4 ტესტის სურათისთვის

გაიმეორეთ ნაბიჯები 3 და 4 ტესტის სურათისთვის
გაიმეორეთ ნაბიჯები 3 და 4 ტესტის სურათისთვის

*შენიშვნა: ტესტის სურათზე იმპროფილური ხაზის დახაზვისას, დარწმუნდით, რომ დახაზეთ ის კვადრატებზე, რომელიც შეესაბამება იმ ხაზს, რომელიც თქვენ დახატეთ საკონტროლო სურათზე.

ნაბიჯი 6: გამოთვალეთ ობიექტივის გადიდება

გამოთვალეთ ობიექტივის გადიდება
გამოთვალეთ ობიექტივის გადიდება

გადიდებული გაზომვები გამოითვლება პლატოს სიგრძის საშუალო გაყოფით, რომელიც გამოითვლება მე –5 საფეხურზე, საკონტროლო პლატოს სიგრძის საშუალოზე, რომელიც გამოითვლება მე –4 საფეხურზე. ეს გამოითვლება 1.0884.

გადიდება = საშუალო (პლატო სია)/საშუალო (ControlPlateauList);

ნაბიჯი 7: R- კვადრატის პოვნა და მომხმარებლის რეცეპტი ინტერპოლაციის გზით

R- კვადრატის პოვნა და მომხმარებლის რეცეპტი ინტერპოლაციის გზით
R- კვადრატის პოვნა და მომხმარებლის რეცეპტი ინტერპოლაციის გზით

კოდის გამოყენებით:

  • md1 = fitlm (GivenPrescription, MagArray);
  • Rsquared = md1. Rsquared. ჩვეულებრივი;

ჩვენ შეგვიძლია ვიპოვოთ გრაფიკი GivenPresciption (ჩვენი ლინზები მოცემულია მნიშვნელობებით) R- კვადრატის მნიშვნელობის წინააღმდეგ MagArray (ადრე გაანგარიშებული გაზომვის თანაფარდობების მასივი). საკმარისად მაღალი R- კვადრატული მნიშვნელობით, შეიძლება დავასკვნათ, რომ არსებობს საკმაოდ ძლიერი კორელაცია ამ მეთოდის გამოყენების გასამართლებლად. ამ კონკრეტული შემთხვევისთვის, R- კვადრატის მნიშვნელობა იყო 0.9912, რაც ვარაუდობს ძლიერ კორელაციას და, შესაბამისად, გამართლებულია ამ მეთოდის ანალიზში გამოყენება.

ფუნქციის გამოყენება:

Prescription = interp1 (MagArray, GivenPrescription, magnification, 'linear');

ჩვენ შეგვიძლია გავადიდოთ ჩვენი გადიდების კოეფიციენტის შესაბამისი დანიშნულების მნიშვნელობა (x ღერძზე) (მნიშვნელობა y ღერძზე) და ვიპოვოთ რა არის მომხმარებლის დანიშნულება.

მონაცემების ინტერპოლაცია მნიშვნელოვანია ამ მეთოდის მუშაობისთვის, რადგან ის გვაძლევს საშუალებას გამოვიყენოთ ვარაუდები ინფორმაციის შესახებ, რომელიც ჩვენ არ გვაქვს, ჩვენს მიერ არსებული ინფორმაციის საფუძველზე. მიუხედავად იმისა, რომ საუკეთესოდ მორგებული ხაზი იქნება ტექნიკურად უფრო ძლიერი კანდიდატი ამ ვარაუდისთვის, საზღვრების შექმნა შედეგების რაოდენობის შესამცირებლად იგივე ეფექტს ახდენს, როგორც დანიშნულებისამებრ სათვალეები ყოველმხრივ დამატებით ერთგვაროვან მნიშვნელობებში. ეს ახსნილია შემდგომ ნაბიჯებში.

ნაბიჯი 8: მომხმარებლის რეცეპტის ჩვენება გრაფიკზე

მომხმარებლის რეცეპტის ჩვენება გრაფიკზე
მომხმარებლის რეცეპტის ჩვენება გრაფიკზე

გამოიყენეთ შემდეგი კოდი:

  • ფიგურა;
  • ნაკვეთი (მოცემული prescription, MagArray, '-g')
  • შეჩერდი
  • ნაკვეთი (რეცეპტი, გადიდება, 'bp')
  • თავი დაანებე
  • ბადე
  • ლეგენდა ("მონაცემები", "ინტერპოლირებული ქულები", "მდებარეობა", "NW")

ჩვენ შეგვიძლია შევადგინოთ გრაფიკი, რომელიც აჩვენებს გადიდების კოეფიციენტებს მოცემულ რეცეპტთან მწვანე ხაზით და ჩვენი გამოთვლილი გადიდების მონაცემებს ცისფერ ვარსკვლავთან ჩვენი ინტერპოლირებული რეცეპტის წინააღმდეგ. შემდეგ ლეგენდა იწერს სათაურს, x ღერძს და y ღერძს და ათავსებს ლეგენდას ზედა მარცხენა კუთხეში.

ნაბიჯი 9: შეამცირეთ თქვენი რეცეპტი

შეამცირეთ თქვენი რეცეპტი
შეამცირეთ თქვენი რეცეპტი

შემდეგი კოდი გამოიყენება რეცეპტის დამრგვალებისთვის:

  • თუ რეცეპტი <= 1.125

    CalculatedPrescription = '1.0';

  • elseif რეცეპტი <= 1.375

    გამოთვლილი prescription = '1.25';

  • elseif რეცეპტი <= 1.625

    CalculatedPrescription = '1.5';

  • elseif რეცეპტი <= 1.875

    გამოთვლილი prescription = '1.75';

  • elseif რეცეპტი <= 2.25

    CalculatedPrescription = '2.0';

  • elseif რეცეპტი <= 2.625

    CalculatedPrescription = '2.5';

  • elseif რეცეპტი <= 3

    გამოთვლილი prescription = '2.75';

  • elseif რეცეპტი <= 3.375

    გამოთვლილი prescription = '3.25';

  • სხვა

    CalculatedPrescription = 'უცნობი';

  • დასასრული

ინტერპოლაციის გზით ნაპოვნი რეცეპტი სულაც არ ასახავს რეალურ რეცეპტს - ეს იმიტომ ხდება, რომ ადამიანის შეცდომის გამო ყოველთვის იქნება მცირედი ცვლილებები ფოტოს გაანალიზებაში. ამრიგად, ჩვენ გვჭირდება ეს ნაბიჯი რეალური რეცეპტის კლასიფიკაციისთვის.

მოცემული რეცეპტები ჩვეულებრივ იწყება 1,0 დიოპტრიდან და იზრდება 0,25 -ით მათ რეცეპტებში, ამიტომ რეცეპტის გამოთვლის შემდეგ ჩვენ გვსურს განვსაზღვროთ ის რეცეპტი, რომელიც საუკეთესოდ მოერგება იმას, რაც მომხმარებელს შეიძლება დასჭირდეს. რეცეპტის გაანგარიშების შემდეგ, ჩვენ ვატარებთ მას მოცემული If განცხადებების საშუალებით, რომ შევამოწმოთ მისი ღირებულება და დავადგინოთ რომელი დანიშნულებაა საჭირო. არაფერი ნაკლები ან ტოლი 1.125, მაშინ რეცეპტი არის 1.0. ყველაფერი რაც ნაკლები ან ტოლია 1.375, რეცეპტი არის 1.25. არაფერი ნაკლები ან ტოლი 1.625, რეცეპტი არის 1.5. არაფერი ნაკლები ან ტოლი 1.845, რეცეპტი არის 1.75. Და ასე შემდეგ.

ჩვენ გვაქვს ფასეულობების ზრდა, რადგან ჩვენ ვამოწმებთ, არის თუ არა ღირებულებები ნაკლები. თუ ჩვენ ვამცირებთ მნიშვნელობების შემცირებას, მაშინ პირველი if განაცხადი წაიკითხავს პირველ if განცხადებას ყველა დროის განმავლობაში. თუ რეცეპტი არის ყველაზე პატარა, ჩვენ გვსურს, რომ ის მაშინვე აღიარდეს, როგორც უმცირესი, ამიტომაც არის, რომ ყველაზე მცირე ღირებულება არის ის, რაც ჩვენ დავიწყეთ. ყველაფერი, რაც ყველაზე მაღალია, ნიშნავს იმას, რომ რეცეპტი არ ემთხვევა ჩვენს მონაცემებს, ამიტომ ის "უცნობ" სტრიქონს კითხულობს.

გირჩევთ: