İçindekiler:

Göz Kürenizin Reçetesi: Bir BME60B Projesi: 9 Adım
Göz Kürenizin Reçetesi: Bir BME60B Projesi: 9 Adım

Video: Göz Kürenizin Reçetesi: Bir BME60B Projesi: 9 Adım

Video: Göz Kürenizin Reçetesi: Bir BME60B Projesi: 9 Adım
Video: Coğrafiyanın predmeti. 6-11 Atlas üzrə iş. 2024, Kasım
Anonim
Göz Kürenizin Reçetesine Göz Atma: Bir BME60B Projesi
Göz Kürenizin Reçetesine Göz Atma: Bir BME60B Projesi

Yazan: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste

Büyütme, diyoptri reçetelerine göre sınıflandırılan okuma gözlükleri için mevcut olan temel özelliklerden biridir. Michigan Teknoloji Üniversitesi'ne göre, bir diyoptri, genellikle metre biriminde (Michigan Teknoloji Üniversitesi) mm cinsinden ölçülen lensin odak uzaklığıdır. Okuma gözlüklerinin dışbükey mercekleri olduğundan, odak uzaklığı pozitif olur ve diyoptrilerin de pozitif olmasına neden olur (HyperPhysics). Objektif arasındaki mesafe gerçek mercekten uzaklaştıkça odak uzaklığı artar ve bu da diyoptrilerin ters orantılı oldukları için azalmasına neden olur. Bu nedenle ek diyoptrili okuma gözlüğüne sahip olmak merceğin görüntüyü yakınlaştırmasına yardımcı olur, böylece diyoptri değerini artırarak odak uzaklığı daha azmış gibi görünebilir.

Sunulan kod, reçetesi bilinmeyen bir merceğin diyoptrisini tahmin etmek için kullanılacaktır. Reçeteyi hesaplamak için iki giriş kullanılır: herhangi bir lens kullanmadan kontrollü arka planın bir fotoğrafı ve aynı arka planın ancak tercih edilen lens aracılığıyla başka bir fotoğrafı. Program bu iki fotoğraf arasındaki bozulmayı ölçecektir. Oradan, lensin diyoptrisini tahmin edebileceğiz ve kullanıcının görmesi için bir sonuç üretebileceğiz.

Bu Eğitilebilirlik için ihtiyacınız olacak:

  • 11x8.5 boyutunda bir kağıda basılmış siyah beyaz bir dama tahtası deseni
  • Odağını kilitleme özelliğine sahip bir kamera
  • Bir tripod veya kamerayı sabitlemek için benzeri bir şey
  • Çeşitli okuma gözlüğü reçeteleri
  • MATLAB

1. Adım: Fotoğraf Çekin

Fotoğraf çek
Fotoğraf çek
Fotoğraf çek
Fotoğraf çek
Fotoğraf çek
Fotoğraf çek

Bir merceğin büyütme oranını hesaplamak için, onu nesnenin gerçek boyutuyla karşılaştırabilmeniz gerekir. Bu proje için büyütülmüş bir görüntüyü kontrol görüntüsüyle karşılaştıracağız.

Bu nedenle, ilk adım aynı görüntünün iki fotoğrafını çekmektir - ilki sadece kameradan, ikincisi test etmek istediğiniz okuma gözlüğünün merceğinden.

1 inç ızgaralı 8,5x11 inç siyah beyaz dama tahtasının fotoğrafını çekeceksiniz. Kameranızı dama tahtasından 11 dakika uzağa kurun. Fotoğrafları çekmeden önce odağı dama tahtasına kilitleyin.

Okuma gözlüğü olmadan dama tahtasının fotoğrafını çekin. Ardından hiçbir şeyi hareket ettirmeden okuma gözlüklerini kameranın önüne yerleştirin ve ikinci fotoğrafı çekin.

Çekimler arasında kameranızın konumunun hareket etmediğinden emin olun. İki fotoğraf arasında değişmesi gereken tek şey kameranın önünde gözlük merceğinin bulunması.

Fotoğraflarla işiniz bittiğinde, bilgisayarınıza yükleyin.

Adım 2: Görüntüleri MATLAB'a Yükleyin

Görüntüleri MATLAB'a Yükleyin
Görüntüleri MATLAB'a Yükleyin

Yeni bir komut dosyası açın.

İlk olarak, fotoğrafların depolandığı dizini belirtin. Ardından,-j.webp

Dir = 'C:\Users\kuras\Desktop\classes\SQ2\BME60b\Sandbox\testphotos'; GetDir = dir('*.jpg');

Projemiz için programın kullanıcısına hangi dosyaları karşılaştırmak istediğini sormak istedik. İlk bölüm kullanıcıdan kontrol görüntüsünü belirlemesini, ikinci bölüm ise kullanıcıdan test görüntüsünü belirlemesini ister.

  • %Kullanıcıya hangi dosyanın kontrol görüntüsü olduğunu sorun.
  • Kontrol = input('# kontrol görüntüsü.\n');
  • ControlFile = [GetDir(Control).name]
  • %Kullanıcıya, analiz etmek istediği görüntünün hangi dosya olduğunu sorun.
  • SelectFile = input('\nanaliz etmek istediğiniz görüntü sayısı.\n');
  • PrescripFile = [GetDir(ChooseFile).name];

Adım 3: Görüntü Analizi

Görüntü analizi
Görüntü analizi
Görüntü analizi
Görüntü analizi

MATLAB'da renkli bir görüntü MxNx3 boyutundayken, gri tonlamalı bir görüntü MxN'dir. Bu, izlenecek daha az veri olduğundan gri tonlamalı bir görüntüyü geliştirmenin/düzenlemenin daha hızlı olduğu anlamına gelir. Görüntüyü gri tonlamaya dönüştürmek için rgb2gray kullanın. (Fotoğraflarımız yatay geldiği için döndürme işlevi kullanıldı - bu kod satırı sizin sürümünüzde gerekli olabilir veya olmayabilir.)

  • %gri tonlamaya dönüştür ve döndür
  • ben = imread(ControlFile);
  • ben = rgb2gray(I);
  • I = imrotate(I, 90);

Ardından, görüntüyü görüntüleyin. Alt grafik işlevi, test görüntüsünün sonraki adımlarda kontrolün yanında olabilmesi için kullanılır.

  • %Görüntüle
  • Şekil 1);
  • alt grafik(1, 2, 1)
  • imshow(I);
  • başlık(Kontrol Dosyası);

Kullanıcıdan dama tahtasını tam görüntüden kırpmasını istemek için imcrop'u kullanın. Aşağıdaki kod, kullanıcıya talimat sağlamak için bir mesaj kutusu da gösterir.

  • Analiz için dama tahtasını %kırp
  • waitfor(msgbox({'Dama tahtasını kesmek için artı işaretlerini kullanın.', 'Ardından ilgili alana çift tıklayın.'}));
  • I_crop = imcrop(I);

Görüntüyü ikili hale getirmek için imbinarize kullanın.

I_binary = imbinarize(I_crop);

Adım 4: Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın

Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın
Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın
Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın
Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın
Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın
Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın

Ardından, kullanıcıdan imline kullanarak görüntü boyunca bir çizgi çizmesini isteyin. Bu çizgi, dama tahtası boyunca yatay olarak çalışmalıdır. Siyah bir karede başlamalı ve bitmelidir (nerede olduğu önemli değil) - bunun nedeni siyah karelerin değil beyaz karelerin genişliğini ölçeceğimizdir.

  • %çizgi çiz
  • Şekil 1)
  • alt grafik(1, 2, 1)
  • imshow(I_binary);
  • waitfor(msgbox({'Siyah bir boşluktan siyah bir boşluğa 9 kutuyu kapsayan bir çizgi çizmek için tıklayın ve sürükleyin.', 'Onaylamak için çift tıklayın.'}));
  • çizgi = imline;
  • pozisyon = bekle(satır);
  • uç noktalar = line.getPosition;

Çizilen çizginin uç noktaları için X ve Y koordinatlarını çıkarın.

  • X = uç noktalar(:, 1)
  • Y = uç noktalar(:, 2);

Çizilen çizgi boyunca bulunan yoğunluklara dayalı bir grafik oluşturmak için doğaçlama kullanın. Bu, 0 (siyah) ile 1 (beyaz) arasında değişen bir kare dalgaya benzemelidir. Zirveleri ve konumlarını da hesaplayın.

  • şekil 2)
  • alt grafik(1, 2, 1)
  • title('Doğaçlama çizgisi boyunca görüntü yoğunluğu (Kontrol)')
  • improfile(I_binary, X, Y); ızgara açık;
  • [~, ~, c1, ~, ~] = improfile(I_binary, X, Y);
  • [tepeler, loc] = findpeaks(c1(:,:, 1));
  • devam etmek
  • arsa(loc, tepe noktaları, 'ro');
  • uzak durmak

Bir for döngüsü kullanarak doğaçlama grafiğindeki her bir platonun uzunluğunu bulun. İmprofil grafiğinde bulunan aynı miktarda tepe noktası için for döngüsünü çalıştırın. Her bir platonun uzunluğunu hesaplamak için, "0" yoğunluk değeri yerine "1" olan tüm konumları bulmak için "bul" işlevini kullanın. Ardından, piksel cinsinden beyaz bir karenin genişliğine eşit olması gereken platonun toplam uzunluğunu elde etmek için bu dizinin uzunluğunu hesaplayın. ControlPlateauList = sıfırlar(1, uzunluk(loc));

i = 1:uzunluk(lok) için

eğer ben == uzunluk(lok)

plato = bul(c1(loc(i):son,:, 1));

Başka

plato = bul(c1(loc(i):loc(i+1)-1,:, 1));

son

ControlPlateauList(i) = uzunluk(plato);

son

Adım 5: Test Görüntüsü için Adım 3 ve 4'ü tekrarlayın

Test Görüntüsü için Adım 3 ve 4'ü tekrarlayın
Test Görüntüsü için Adım 3 ve 4'ü tekrarlayın

*Not: Test görüntüsüne uygun olmayan çizgiyi çizerken, kontrol görüntüsü üzerinde çizdiğiniz çizgiye karşılık gelen kareler boyunca çizdiğinizden emin olun.

Adım 6: Lensin Büyütmesini hesaplayın

Lensin Büyütmesini hesaplayın
Lensin Büyütmesini hesaplayın

Büyütülmüş ölçümler, 5. adımda hesaplanan plato uzunluğunun ortalamasının, 4. adımda hesaplanan kontrol platosunun uzunluğunun ortalamasına bölünmesiyle hesaplanır. Bu, 1.0884 olarak hesaplanır.

büyütme = ortalama(platauList)/mean(ControlPlateauList);

Adım 7: Interpolasyon Yoluyla R-kare ve Kullanıcı Reçetesini Bulma

İnterpolasyon Yoluyla R-kare ve Kullanıcı Reçetesini Bulma
İnterpolasyon Yoluyla R-kare ve Kullanıcı Reçetesini Bulma

Kodu kullanarak:

  • md1 = fitlm(GivenPrescription, MagArray);
  • Rskare = md1. Rsquared. Sıradan;

GivenPresciption (lenslerimizde verilen değerler) grafiğinin R-kare değerini MagArray (daha önce hesapladığımız büyütme ölçüm oranlarının bir dizisi) ile bulabiliriz. Yeterince yüksek bir R-kare değerine sahip olarak, bu yöntemin kullanımını haklı çıkarmak için yeterince güçlü bir korelasyon olduğu sonucuna varılabilir. Bu özel durum için, R-kare değeri 0.9912'dir, bu da güçlü bir korelasyona işaret eder ve bu nedenle analizde bu yöntemin kullanılmasında haklıdır.

İşlevi kullanma:

Prescription = interp1(MagArray, GivenPrescription, büyütme, 'doğrusal');

Büyütme oranımızın (y eksenindeki bir değer) karşılık gelen reçete değerini (x ekseninde) enterpolasyon yapabilir ve kullanıcının reçetesinin ne olduğunu bulabiliriz.

Verileri enterpolasyon yapmak, sahip olduğumuz bilgilere dayanarak sahip olmadığımız bilgiler hakkında varsayımlarda bulunmamıza izin verdiği için bu yöntemin çalışması için önemlidir. Bu varsayım için teknik olarak en iyi uyum çizgisi daha güçlü bir aday olsa da, çıktı sayısını azaltmak için sınırlar oluşturmak, reçeteli gözlüklerin zaten artımlı tek biçimli değerlerle gelmesiyle aynı etkiye hizmet eder. Bu, sonraki adımlarda açıklanmaktadır.

Adım 8: Kullanıcının Reçetesini Grafik Üzerinde Gösterme

Kullanıcının Reçetesini Grafik Üzerinde Gösterme
Kullanıcının Reçetesini Grafik Üzerinde Gösterme

Aşağıdaki kodu kullanarak:

  • figür;
  • arsa(GivenPrescription, MagArray, '-g')
  • devam etmek
  • arsa(Reçete, büyütme, 'bp')
  • uzak durmak
  • Kafes
  • legend('Veri', 'İnterpolasyonlu Noktalar', 'Konum', 'KB')

Büyütme Oranlarını ve Verilen Reçeteyi yeşil bir çizgiyle ve hesaplanan büyütmemizin bulunan verilerini mavi bir yıldızla enterpolasyonlu reçetemize karşı gösteren bir grafik çizebiliriz. Ardından gösterge başlığı, x eksenini ve y eksenini etiketler ve göstergeyi sol üst köşeye yerleştirir.

Adım 9: Reçetenizi Daraltın

Reçetenizi Daraltın
Reçetenizi Daraltın

Reçete için yuvarlama oluşturmak için aşağıdaki kod kullanılır:

  • eğer Reçete <= 1.125

    HesaplananReçete = '1.0';

  • elseif Reçete <= 1.375

    HesaplananReçete = '1.25';

  • elseif Reçete <= 1.625

    HesaplananReçete = '1.5';

  • elseif Reçete <= 1.875

    HesaplananReçete = '1.75';

  • elseif Reçete <= 2.25

    HesaplanmışReçete = '2.0';

  • elseif Reçete <= 2.625

    HesaplanmışReçete = '2.5';

  • elseif Reçete <= 3

    HesaplananReçete = '2.75';

  • elseif Reçete <= 3.375

    HesaplananReçete = '3.25';

  • Başka

    CalculatedPrescription = 'bilinmeyen';

  • son

Enterpolasyon yoluyla bulunan reçete, gerçek reçeteyi yansıtmayabilir - bunun nedeni, insan hatası nedeniyle fotoğrafın analizinde her zaman küçük farklılıklar olacaktır. Bu nedenle, gerçek reçeteyi sınıflandırmak için bu adıma ihtiyacımız var.

Verilen reçeteler genellikle 1,0 diyoptriden başlar ve reçetelerinde 0,25 artar, bu nedenle reçeteyi hesapladıktan sonra kullanıcının ihtiyacına en uygun reçeteyi belirlemek isteriz. Reçeteyi hesapladıktan sonra, değerini kontrol etmek ve hangi reçetenin gerekli olduğunu belirlemek için verilen If ifadeleri üzerinden çalıştırırız. 1.125'ten küçük veya buna eşit herhangi bir şey varsa, reçete 1.0'dır. 1.375'ten küçük veya buna eşit herhangi bir şey, reçete 1.25'tir. 1.625'ten küçük veya buna eşit herhangi bir şey, reçete 1.5'tir. 1.845'ten küçük veya buna eşit herhangi bir şey, reçete 1.75'tir. Ve bunun gibi.

Değerlerin küçük olup olmadığını kontrol ettiğimiz için artan değerlere sahibiz. Değerleri azaltsaydık, ilk if deyimi her zaman ilk if deyimini okurdu. Reçete en küçükse, onu hemen en küçük olarak tanımasını istiyoruz, bu yüzden başladığımız en küçük değer bu yüzden. En yüksek değerden daha yüksek herhangi bir değer, reçetenin verilerimizle uyumlu olmadığı anlamına gelir, bu nedenle “Bilinmeyen” dize okumasını verecektir.

Önerilen: