Genellikle kenar algılama, görüntüdeki yüksek gradyan değerine sahip alanları tespit etmek için kaynar.
Bizim durumumuzda, degradeyi görüntü işlevinin türevi olarak kabaca görebiliriz, bu nedenle degradenin büyüklüğü, görüntünüzün yerel olarak ne kadar değiştiği hakkında (komşu pikseller / metinler açısından) bilgi verir.
Şimdi, bir kenar, süreksizlik belirtisi olarak, şimdi de tanımladığımız gibi, bu bilginin ihtiyacımız olan tek şey olduğu açıktır. Bir görüntünün gradyanını bulduktan sonra, bir ikili değer kenar / kenar olmayan elde etmek için ona bir eşik uygulamak meselesidir.
Bu gradyanı gerçekten nasıl soruyorsun ve nasıl cevaplayacağım :)
Birçok yol! İşte bir çift :)
Yerleşik gölgelendirici işlevleri
Hem hlsl hem de glsl türev fonksiyonları sunar. GLSL olarak sahip dFdx ve dFdy x ve y yönünde, sırasıyla gradyan bilgi verir. Tipik olarak bu fonksiyonlar 2x2'lik bir blok halinde değerlendirilir.
Eğer tek bir doğrultuda ilgilenen sürece, iyi bir şekilde bölgede degrade olduğunu ne kadar güçlü olduğunu gösteren bir kompakt sonuç için fwidth size başka bir şey ama dFdy ve dFdy mutlak değerinin toplamını verir.
Belirli bir kanal yerine genel görüntünün kenarıyla ilgilenme olasılığınız yüksektir, bu nedenle görüntü işlevinizi luma'ya dönüştürmek isteyebilirsiniz. Bunu akılda tutarak, kenar tespiti söz konusu olduğunda gölgelendiriciniz aşağıdakilere benzer bir şey içerebilir:
float luminance = dot(yourFinalColour,vec3(0.2126, 0.7152, 0.0722));
float gradient = fwidth(luminance );
float isEdge = gradient > threshold;
Yüksek bir eşik ile daha kaba kenarlar bulacaksınız ve tersini, düşük bir eşik ile yanlış kenarları tespit edebilirsiniz. İhtiyaçlarınıza daha uygun olan eşiği bulmak için denemeniz gerekir.
Bu işlevlerin çalışmasının nedeni söz etmeye değer, ancak şimdi bunun için zamanım yok, bu cevabı daha sonra güncelleyeceğim :)
İşlem sonrası ekran alanı
Bundan daha meraklı olabilirsiniz, şimdi görüntü işlemede Edge algılama alanı muazzam. İhtiyaçlarınıza göre kenar algılamayı tespit etmek için onlarca iyi yol gösterebilirim, ancak şimdilik basit tutalım, eğer ilgileniyorsanız size daha fazla seçenek gösterebilirim!
Bu nedenle, fikir, daha geniş bir mahalleye bakabilmeniz ve isterseniz çevreleyen örneklerde bir dizi ağırlık kullanabilmeniz ile yukarıdaki fikre benzer olacaktır. Genellikle, sonuç olarak size iyi bir degrade bilgisi veren bir çekirdek ile görüntünüz üzerinde bir kıvrım çalıştırırsınız.
Çok yaygın bir seçim Sobel çekirdeğidir
Sırasıyla x ve y yönlerindeki degradeleri verir:
Tek değeri olarak gradyandan çıkarabilirsiniz.GradientMagnitude=(Gradientx)2+(Gradienty)2−−−−−−−−−−−−−−−−−−−−−−−√
Sonra yukarıda bahsettiğim gibi eşikleyebilirsiniz.
Gördüğünüz gibi bu çekirdek merkezi piksele daha fazla ağırlık verir, böylece degradeyi + geleneksel olarak yardımcı olan biraz yumuşatma hesaplar (genellikle görüntü küçük kenarları ortadan kaldırmak için gauss bulanıklığıdır).
Yukarıdakiler oldukça iyi çalışıyor, ancak yumuşatmayı sevmiyorsanız Prewitt çekirdeklerini kullanabilirsiniz:
(Acele ediyorum, yakında görüntüler yerine doğru biçimlendirilmiş metin yazacağım!)
Gerçekten, gerçek zamanlı grafiklerden ziyade bir görüntü işlemi-y yolunda kenar algılamayı bulmak için çok daha fazla çekirdek ve teknik var, bu yüzden muhtemelen dFdx / y işlevleriyle iyi olacağınız için daha kıvrımlı (punto amaçlanmamış) yöntemleri hariç tuttum .