İçindekiler:
- 1. Adım: Fotoğraf Çekin
- Adım 2: Görüntüleri MATLAB'a Yükleyin
- Adım 3: Görüntü Analizi
- Adım 4: Dama Tahtasındaki Beyaz Karelerin Genişliğini hesaplayın
- Adım 5: Test Görüntüsü için Adım 3 ve 4'ü tekrarlayın
- Adım 6: Lensin Büyütmesini hesaplayın
- Adım 7: Interpolasyon Yoluyla R-kare ve Kullanıcı Reçetesini Bulma
- Adım 8: Kullanıcının Reçetesini Grafik Üzerinde Gösterme
- Adım 9: Reçetenizi Daraltın
Video: Göz Kürenizin Reçetesi: Bir BME60B Projesi: 9 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
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
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
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
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
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
*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
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
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
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ç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:
Bluetooth50g - Kırık Bir HP50G Hesap Makinesi için İleri Dönüşüm Projesi.: 7 Adım
Bluetooth50g - Kırık HP50G Hesap Makinesi için bir Upcycle Projesi.: Pil sızıntısı nedeniyle ekrana giden iletken yollar bozuk. Pil sızdı ve yolları aşındırdı. Hesap makinesi kendi kendine çalışır, ancak sonuçlar ekranda gösterilmez (yalnızca dikey çizgiler). Sistem bir bluetooth klavyeyi taklit eder ve
Sevgililer Günü Projesi: Görünür Bir Kalp Atışı: 9 Adım
Sevgililer Günü Projesi: Görünür Bir Kalp Atışı: Sevgililer Günü yaklaşıyor, onun sizi sevip sevmemesi konusunda endişeleniyor musunuz? Belki sormak istersiniz, ama işte başka bir yol, parmağınızı kalp atışı cihazına koyun, veriler cevabı gösterecektir.Yetişkinlerin kalp atışı yaklaşık 70~80 kat, peki, 60~
Açık Otoklav: Bir İnsani Yardım Yapıcı Projesi: 4 Adım
Açık Otoklav: İnsani Yardım Yapıcı Projesi: Bu projeyi neden yaptım? Dünyada 3 milyar insanın güvenilir elektriğe sahip olmayan kırsal alanlarda yaşadığını ve bu nedenle çoğu zaman erişemediklerini söyleyen bir Dünya Sağlık Örgütü raporunu okudum. cerrahi bakım. Nedeni ise
Üçüncü Göz (Arduino Projesi): 3 Adım
Üçüncü Göz (Arduino Projesi): Hayalet avına çıkmak istediğinizi, ancak birçok deneyimli avcının ve medyumların kullanmamanızı şiddetle tavsiye ettiği bir ouija tahtasından başka bir donanıma sahip olmadığını ve telefonunuz olduğunu hayal edin. bir EVP kaydedici. açmayı denedin mi
Göz Alıcı Bir Ekran (LED Stili) Nasıl Oluşturulur: 9 Adım (Resimlerle)
Göz Alıcı Ekran Nasıl Oluşturulur (LED Stili): Bu, bir okul projesini nasıl yaptığımın bir kaydı kadar öğretici bir şey değil. Yaptığımı tam olarak tekrarlamak muhtemelen size yardımcı olmayacak olsa da, bu proje hemen hemen her ekranı daha göz alıcı hale getirmek için değiştirilebilir