Mustafa Sarı

Mustafa Sarı hakkında

(Samsun, 26.03.1973, ,İTÜ, Elektronik ve Haberleşme Mühendisliği, Yazılım)

3D Görüntü İşleme

3 boyutlu (3D) görüntü işleme tekniklerine önceki makalelerde detaylı olarak değinmiştim. Bu makalede, gerçek ve pratik bir uygulama üzerinde çalışacağız.

Gerçek (endüstriyel olarak kullanabilecek, her koşulda çalışacak, hassa ve tutarlı) bir 3D uygulaması için ihtiyaçlarımız

  1. Ensenso 3D kamera
  2. HALCON görüntü işleme kütüphanesi

Neden 3D kamera kullanıyoruz? 3D görüntü işlemeye ilişkin pek çok sorunu çözmek için uğraşmak yerine, bizim için hazır olarak bu sorunları çözmüş bir kamera kullanmak daha akıllıca da ondan. (Bu blog sitesinde bahsedilen çoğu makale endüstriyel olduğu için, ürün geliştirmeye yönelik, yaz kış, gece gündüz, her ışık ortamında çalışabilecek gerçek bir uygulama sahibi olmayı düşündüğümüz için. Yoksa 3D görüntü işleme için 3D kamera kullanmak zorunda değiliz)

Neden HALCON görüntü işleme kütüphanesi kullanıyoruz? Yine yukarıdaki sebeplerden.

Özetle burada amaç, iş yapmak, ürün geliştirmek, sorun çözmek.

Gelelim iş yapmaya …

Ensenso kamera tutturulmuş test ortamım

Ensenso kamera tutturulmuş test ortamım

Öncelikle, yukarıdaki resimde görüldüğü gibi 3D kamerayı 70-80 cm. yğkseklikte bir yere sabitledim. Kameranın hemen altına da…

3D ölçeceğim kutu

3D ölçeceğim kutu

Yukarıda gördüğünüz, prizma şeklindeki kutuyu koydum.

Tüm yaptığım bu kadar basit. Şimdi HALCON görüntü işleme kütüphanesi geliştirme ortamı HDevelop’u açıp, kameradan görüntü al dediğimde…

Ensenso 3D Kameradan alınan görüntüler

Ensenso 3D Kameradan alınan görüntüler

Burada basitçe görülebildiği gibi kamera bana

  1. Left Image (Sol gözün görüntüsü. Ensenso içinde 2 kamera olduğundan..)
  2. Right Image (Sağ gözün görüntüsü)
  3. x-Image (mm. cinsinden x mesafeleri)
  4. y-Image (mm.cinsinden y mesafeleri)
  5. z-Image (mm cinsinde z-yükseklikleri)

bilgilerini vermektedir. Artık her bir noktanın mm cinsinden hangi koordinatlarda olduğunu biliyorum. Her bir noktanın yüksekliğini, merkez noktadan uzaklıklarını…

Örneğin bir robot var ise, bu kutunun tam orta noktasının x ve y değerlerini ve z-yükseklik bilgisini ileterek, parçayı almasını sağlayabilirim.

Elbette 3D ile yapabileceklerimiz çok daha fazla.

Burada hızlıca, bir 3D kamera ve HALCON görüntü işleme kütüphanesi ile, ne kadar hızlıca yol alınabileceğini göstermek istedim.

Gerçek hayatta 3D Matching (3 boyutlu eşleştirme), Surface matching (yüzek eşleştirme), 3D Measurement (3 boyutlu ölçüm) gibi daha detaylı uygulamalar geliştirmek de mümkündür.

Bir yerlerden başlamak ve çok hızlı profesyonelce yol almak isteyenler için, bir başlangıç olabilmesi dileğiyle.

İyi Çalışmalar Dilerim..

Mustafa SARI.

Kameralı Hacim Ölçümü – 3

Mavis kamera ile hacim (en-boy-yükseklik) ölçen sistemin 3. versiyonunu geliştirdi.

Herhangi bir yere dayama gerektirmeyen, görüntü alanı içinde herhangi bir yere koyulabilen, 1.5 mt yüksekliğe kadar cisimlerin hacmini ölçen sistemi test kullanımına aldı.

Ölçüm sonuçları

2 adet kamera ile ve tamamen Mavis tarafından geliştirilmiş yeni bir teknoloji ile, görüş alanının herhangi bir yerine koyulan cisimlerin hacmi, hızlı ve doğru bir şekilde ölçülmektedir.
Kantardan gelen ağırlık bilgisi de eklenerek, en-boy-yükseklik (desi) bilgisi de eklenerek barkod oluşturulmakta, veritabanına kaydedilmekte ve ilgili sistemlerle entegrasyon sağlanmaktadır.

Kargo firmaları gibi pek çok yerde kullanılması muhtemel olan sistemin çalışması istenildiği takdirde görülebilir, demo kurulum yapılabilir.

Uygun İşleme Yönteminin Seçimi

Tipik bir yapay görme problemini çözmek için pek çok farklı yaklaşım getirilebilir. İdeal yaklaşımı seçmek çoğu zaman pek kolay olmayabilir.

HALCON Alternatif yöntemler sunar

Görüntü işlemeye yeni başlayanlar genelde “Blob analysis” olarak belirttiğimiz, segmentation işlemleri ile (thresholding, filtering, selection …) işleri çözmeye meyillidirler. Oysa HALCON pek çok farklı alternatif disiplini sunmaktadır.

Uygun Metod?

Bu makalede; basitçe “Dairenin merkezini bulma” uygulamasını, farklı metodolojiler kullanarak nasıl gerçekleştirebiliriz ona değineceğiz.

Her bir metodolojinin farklı avantaj ve dezavantajları olabildiğinde, ideal olanı, projeye en uygun yöntemi seçmektir (ki çoğu zaman pek kolay değildir)

İleride makaleye yukardaki resimde anlatılan yolları tek tek inceleyerek devam edeceğiz. Görüşmek üzere…

Kameralı Hacim Ölçümü – 2

Kargo firmaları v.b. yerler için, hızlı hacim ölçen (en boy yükseklik) çözümümüz 1 aylık test kullanımından sonra, evrimleşerek daha hassas ve daha tutarlı bir hale getirildi.

Sistemin Kurulumu

Sistemin Kurulumu

Sistemin Kurulumu

Sistem, belirli bir açı ile yerleştirilmiş, otofokus, renkli ve yüksek çözünürlüklü 2 kamera ile, 1.5 metreküplük bir yeşil bölge içindeki, 1.2 metreküplük bir hacmi ölçmeye yarar. (Maksimum yükseklik boy genişlik 1.2 m olacak şekilde)

Kameralardan biri, yükseklik ölçmeye, diğeri ise en ve boy bulmaya yarar.
Ölçüm işlemi 1 sn kadar sürer.
Sistemin, kendi aydınlatması olduğundan, ışık değişimi, gece gündüz, yaz-kış farkı gibi dış etkenlerden etkilenmez.
Endüstriyel koşullarda (çok düşük / yüksek sıcaklıklar v.b.) çalışabilir.
Kurulduktan sonra, bakım gerektirmez.

Kameralı Yükseklik En Boy Ölçümü
Sistemin Genel Özellikleri

  • Tüm Sonuçlar Kaydedilir (5 Yıl)
  • Alınan Resimler Saklanır (1 Yıl)
  • Tartım Bilgisi (Ağırlık) Okunabilir
  • Barkod, Fiş, Fatura Çıkartılabilir
  • Web, Intranet, Veritabanı ile diğer sistemlerle entegre olabilir

 

Hacim ölçüm sistemi, sadece koli (kutu, kübik) şekiller için değil, hemen her tür serbest geometriye sahip hacim ölçümlerinde kullanılabilir.

Program Görüntüsü

 

 

 

 

 

 

 

Sistem Tarafından Ölçülen Hacim Tipleri

Slayt51. Kutu, Koli vb. Kübik Ölçümler

En, boy ve yükseklik değerleri ölçülür. Santimetre cinsinden ölçülen bu değerlerden desi hesaplanır.

Eğer koliler fiziksel olarak ayrılabiliyorsa, her birini ayrı ayrı ölçmek daha doğru bir yaklaşım olacaktır. Fiziksel olarak birbirine bağlı ya da ayrılamayan nesneler varsa, en yüksek noktanın yüksekliği baz alınarak ölçüm yapılacaktır. Böyle bir durumda, aralardaki boşluklar, tamamlanarak hacim ölçümü yapılacaktır. (Gerçekte olandan daha büyük hacim bulunabilir)

Slayt5

 

 

 

 

 

 

 

 

 

 

2. Serbest Şekilli Hacimler

Belirli bir geometrik şekle sahip olmayan (gitar, tampon, çuval, saksı bitkisi, araba tekeri v.b.) şekiller için hesaplanan hacim.

Bu tür hacim hesaplamalarında, hem nesnenin gerçek hacmi, hem de bu nesneyi çevreleyen en küçük kutunun hacmi ayrı ayrı hesaplanır. Dilenirse, bu iki ölçüm değerinin ortalaması alınabilir.

Slayt7Slayt6

 

 

 

 

 

 

 

 

Sistemin Kullanımı

Slayt8

Ölçüm; hacmi ölçülecek nesneyi (koli, kutu vs.) tartının üzerine koyulup bir tuşa basılması ile yapılır.

Ölçüm ile tartım işlemi aynı anda olduğundan ilave vakit kaybı getirmemektedir.

Sistemin daha da geliştirilmiş son hali için şu sayfamıza da bakınız…

HALCON ile Gradient Domain

Uzunca bir süredir eni konu bahsetmek istediğim ama bir türlü elimin gitmediği, son yılların en çok araştırılan, üzerinde en çok çalışılan, bir o kadar da bilinmeyen (pek yaygınlaşamayan) görüntü işleme konularından biri olan, Gradient Domain konusuna girmek, bugüne nasip oldu. Başlayalım bakalım…

Ön Bilgi

Resim (Fotoğraf) matematiksel olarak bir çok farklı biçimde modellenebilir / gösterilebilir. Bunlardan en yaygın kullanılanı S-domain sunumu olan spatial domain ismi verilen sunumdur. Bu hepimizin bildiği, her bir pixelin intensity (ışık şiddet / gray value) değerini tuttuğu notasyondur.

Normalde sık sık kullandığımız threshold işlemleri v.b. çoğu fonksiyon, işte bu spatial domain verileri üzerinden işlem yaparlar. Burada, her bir pixel bağımsız olarak ele alınır. Örneğin, tamamen beyaz (gri değeri = 255) olan pixelleri seçmek istiyorsam, bu pixellerin sağına soluna bakmadan, 255 değere sahip olan her bir pixel seçilir.

Tam bu noktada, gradient domain farklı bir yaklaşım sunar. Her bir pixelin tam ve kesin değeriyle ilgilenmek yerine, o pixele komşu olan diğer pixeller ile arasındaki farkı da göz önüne alarak bir matematiksel model bulmaya çalışır. Şimdi her bir pixel değerinin bir öncesi dediğimiz zaman, işi bir seriye dökmeye ihtiyacımız var demektir. Zaten spatial-domain resim dediğimiz, satır ve sütunlardan oluşan bir matris ya da yatay ya da dikey diziler şeklinde düşünülebilir. Elimizdeki bir dizinin elemanlarının değerleri, belirli bir periyotla ya da belirli bir pattern ile tekrarlanıyorsa bu durumda matematiksel olarak frekas domain (frequency domain) den söz edebilirim. (F-domain) f-domain uzayına geçtiğimizde, tıpkı bir dosyanın sıkıştırılması ve geri açılması algoritmalarında olduğu gibi, pixel değerlerinin belirli bir mantığa göre (pattern) tekrarlanması ve bu tekrar mantığını kullanarak, istediğimde orijinal değerlerine ulaşabilmem garanti edilmiş olur. Bunu yapabilmenin en kolay yolu Fourier Transformu’dur. Elimdeki s-doiamn dizisini (satırlar ya da sütunlar), fourier transformuna (hızlı olsun diye fast fourier çoğu kez) tabi tutarsam, resmi bu kez f-domaine almış olurum.

Şimdi elimizde fourier transformu alınmış bir resim var. Durduk yere neden f-domain ile çalışmaya karar verdik? Çünkü artık elimizde matematiksel olarak modellenmiş bir seri var ve her tür spectral işlemleri (lowpass, highpass, bandpass gibi filtleler, konvolüsyon, laplace açılımları v.b. …) yapabileceğimiz tamamen yeni bir matematiksel uzaya geçmiş bulunuyoruz ve bu sonsuz uzayda dilediğimiz gibi at koşturmanın avantajlarından yararlanalım istiyoruz… (elimizde tek bir pixelin gri değeri vardı, nereden nereye geldik.. f-domain ile dur bakalım sonu nereye varacak 🙂 )

Gradient domain resmi iki bileşenden oluşur. Satır dizisinin türevi alınmış hali Dx, Sütun dizisinin türevi alınmış hali Dy. Dx ve Dy resimlerine bakarsanız, sanki daha çok kenar (edge) çizgileri ile ilgilenmiş gibi? Çünkü her bir pixelin ışık değerinin, komşu pixeller ile olan farkı (türevi) ile ilgileniyor. Tam kenarlarda, ışık değişimi çok daha fazla olduğu için, beklentimize uygun bir sonuç.

Tek boyutlu bir fonksiyonda (dizi) bu fonksiyonun gradient domain fonksiyonu, kısaca onun ilk türevi şeklinde düşünülebilir. (Bu yüzden genelde kenar değerleri pik yapmakta, kenar olmayan, yani ışık şiddetinin değişmediği ya da az değiştiği yerlerde türev sıfır olmaktadır) Gradient domain, eğer spatal domain resminin 1. türevi ise, bu durumda bunun integralini alırsam ne olur? Tabii ki orijinal resme yakın bir resmi elde etmiş olurum.

 

 

 

 

Peki bunca matematiği, dön dolaş başa gelmek için mi yaptık? Tabii ki hayır, o aradaki a katsayısını kaybedebilmek için yaptık.

Yani?

Düşünelim ki, bir resim aldık, doğal olarak bu resmin içinde çeşitli gürültüler (noise) var. Ben orijinal resmi bozmadan, sadece bu gürültüleri nasıl eleyebilirim? Eğer orijinal resim f(x), gürültü a ise, ve benim elimdeki resim de haliyle f(x) + a şeklinde bana gelmiş ise, işte tüm mesele bu a değerini ayıklamaktan ibarettir. Özetle Gradient domain de işte bu işe yaramaktadır. Burada iş yine kolay değildir, çünkü gürültü fonksiyonu, integre edilemeyen bir sabit şeklindedir. Bu yüzden iş biraz biz programcılara düşecektir. Uygun parametreleri vererek sonucu gözlemleyerek, ihtiyacımıza en çok uyan değeri seçeceğiz (Gürültü her resim için sabit olmayacaktır. bazen çok az, bazen çok fazla olabilir. Dolayısıyla, her resimden gürültüyü ele gibi bir fonksiyon beklememekle birlikte, bu eleme işlemi, programcının seçtiği kadar yaptırılabilir)

Gerçek bir örnekle gösterelim..

Yukarıdaki sonucu test edebileceğiniz HALCON örneğini buradan indirebilirsiniz.

Gradient Domain, filtreleme dışında pek çok alanda kullanılmaktadır. Cep telefonlarımızda bile yer alan HDR işlemi, seamless stitching dediğimiz, bir görüntüyü diğerinin üzerine akıllı olarak yerleştirme, (wikipedia sayfasındaki el üzerine yerleştirilmiş göz resmi resim hayli bilgi verici) kontrast iyileştirme, medikal görüntüleme (x-ray, MR görüntüleri) 3D, color processing, görüntü bindirme gibi alanlarda gittikçe daha sık kullanılmaktadır.

Yukarıda; Termal kamera görüntüsünün, normal kamera görüntüsü ile üst üstebindirilmesi.

Yukarıda; Image Fusion : Görüntülerin üst üste bindirilip, arka planın ve gürültülerin elenmesi.

Yukarıda; surveillance (trafik) görüntüsünden. Hareket halindeki nesnelerin olduğu bir görüntüde, arka zemini bulabilmek ve ayıklayabilmek oldukça güçtür. Gradient Domain çok iyi sonuç vermiştir.

Özet :

Görüldüğü gibi, hemen her alanda oldukça ilgiçn ve başarılı sonuçlar veren gradient domain üzerine ciddi olarak eğilmek gerekmektedir. Real time processing gerektiren işlemler (Sony TV lerdeki Bravia engine vs.) cep telefonlarındaki kamera uygulamaları (çoğu güncel telefon Sony imx240 sensörünü kullanmaktadır fakat hepsinin son kullanıcıya sunduğu görüntü kalitesi farklıdır, geri planda kullandıkları farklı akıllı algoritmalardan dolayı) fark yaratabilmek için bu ve benzeri teknolojileri kullanmak zorundalar.

Zaman buldukça, kişisel olarak geleceğinin iyi olabileceğini gördüğüm görüntü işleme trendlerine yer vermeyi düşünüyorum.

Görüşmek üzere.

Inpaint işlemi (görünmezlik etkisi)

Bir görüntüden, seçili yerlerin kaldırılması ama kaldırılan yerlerin de akıllı bir şekilde doldurulması işlemi, HALCON da inpainting olarak adlandırılan işlemdir. inpaint_ct, inpaint_texture v.b. komutlar bu işi yapmaya yardımcı olur.

geçmiş yıllarda, ingiliz ordusu tarafından görünmez tank geliştiridiği haberleri yayılmıştı. Oradaki teknoloji, yüzeyi silicon kaplı tankın yüzeyine, projektör yardımıyla arka zeminin görüntüsünün yansıtılması idi.

Benim burada bahsedeceğim yöntem ise, alınan bir görüntüden, istemediğimiz kısımları çıkartıp, çıkartılan yerleri akıllı bir şekilde tamamlamaktır.

Örneğin, TV de maç vs. yayınlanırken kaçak maç yayını yapan yerleri yakalayabilmek (!) adına ekrana çıkan sinir bozucu rakamlardan nasıl kurtuluruz?

 

read_image (Mac, 'C:/Users/Mavis/Desktop/Mac.jpg')
gen_rectangle1 (ROI_0, 81.5677, 66.7622, 103.823, 156.445)
reduce_domain(Mac, ROI_0, ImageReduced)
decompose3(ImageReduced, R, G, B)
binary_threshold(B, Region, 'max_separability', 'light', UsedThreshold)
dilation_circle(Region, RegionDilation, 3.5)
inpainting_ct (Mac, RegionDilation, InpaintedImage, 15, 90, 4, 8, 3)

Sadece bu kadar az kod yazarak, ekrandaki beyaz rakamları göndermek mümkündür. İşte sonuç 🙂

HALCON kendi örnekleri de inpainting konusunda oldukça başarılı ve etkileyici. İncelemekte fayda var…

Kameralı Sayma Sistemleri – Devam

Dünden beri, umreden bana gelen tesbihimle oynuyorum. Görüntü işlemecinin olmazsa olmazıymış meğer. Bu tesbihin tanelerini sayan bir uygulama yapalım.

(Yukarıdaki fotoğrafa tıklayıp, 1024 x 768 boyutlarında indirebilirsiniz)

read_image (Tesbih, 'C:/Users/Mavis/Desktop/T2-1024x768.jpg')
dev_close_window()
dev_open_window_fit_image(Tesbih, 0, 0, 600, 300, WindowHandle)
set_display_font(WindowHandle, 16, 'mono', 'true', 'false')
decompose3(Tesbih, R, G, B)
*siyah kisimlari secelim
var_threshold(G, Region, 75, 75, 0.2, 2, 'dark')
opening_circle(Region, RegionOpening, 1.5)
connection(RegionOpening, ConnectedRegions)
select_shape_std(ConnectedRegions, SelectedRegions, 'max_area', 70)
fill_up_shape(SelectedRegions, RegionFillUp, 'area', 1, 1000)
* imameyi eleyelim
fill_up(RegionFillUp, RegionFillUp1)
opening_circle(RegionFillUp1, RegionOpening1, 60)
dilation_circle(RegionOpening1, RegionDilation, 35)
intersection(RegionDilation, RegionFillUp, RegionIntersection)
* her bir boncugu secelim
closing_circle(RegionIntersection, RegionClosing, 4.5)
opening_circle(RegionClosing, RegionOpening, 12)
erosion_circle(RegionOpening, RegionErosion1, 14)
* sayalim
connection(RegionErosion1, ConnectedRegions1)
select_shape(ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
count_obj(SelectedRegions1, Number)
Radius[0:Number-1] := 12
area_center(SelectedRegions1, Area, Row, Column)
gen_circle(Circle, Row, Column, Radius)
dev_display(Tesbih)
dev_display(Circle)
disp_message(WindowHandle, 'Tesbih ' + Number + ' lük' , 'image', 12, 12, 'dark green', 'true')


Uygulamamızı çalıştırdığımızda elde edeceğimiz ekran görüntüsü :

Mavis Kameralı Hacim (En-Boy-Yükseklik) Ölçümü

Koli, paket, kutu v.b. ürünlerin hacmini ölçmek isteyenler (kargo firmaları) için, 2 ya da 3 kameralı hacim ölçüm sistemi geliştirdik.

Win2015 fuarında sunumunu yaptığımız projede, 1 otofokus kamera üstten, 1 otofokus kamera ise yandan bakarak hacim ölçmektedir.

Mavis, Hacim bulma uygulaması için, biri üstten bakan (W x L) diğeri üst çaprazdan bakan (H) 2 kamera kamera ile çözüm sunmaktadır.  Sunulan çözüm alternatiflerine göre (TOF kamera, derinlik sensörü, 3D kamera..) aşağıdaki avantajlara sahiptir.

•Yüksek Çözünürlük (5MPix – 2592×1944)
•Yapay Görme Teknikleri Kullanabilme (Image Processing)
•Gerçek Görüntü – Video Kaydedebilme
•Tüm boyutlarda ölçüm yapabilme
•Otomatik Fokus ile her yüzeyden net görüntü alabilme
•Barkod Okuyabilme
•Özel Şekil Logo Tanıyabilme, Öğrenebilme
•Kolay Kurulum
•Bakım Gerektirmeme
•Ucuza Maliyet

 

Daha fazla bilgi için şu sayfamıza da bakabilir ya da bizimle iletişime geçebilirsiniz.

 

 

Kameralı Sayma

Kameralı sayma sistemleri hızlı ve tutarlı olabilmektedir. Gözle zor sayılan pek çok şey, kamerayla hızlıca sayılabilmektedir. Son zamanlarda daha sık sayma uygulaması istendiğinden, burada bir kaç örnek sayma projesine yer vereyim.

Yukarıdaki resimde ağaç (kütük) sayısını bulan, bir HALCON kodu yazalım.

smooth_image ve watersheds_threshold filtreleri uyguladıktan sonra, zor gibi görünen resim, kolaylıkla sayılabilir hale geldi.

 

İşte aşağıda da tam HALCON kodu (en üstteki resim indirip deneyebilirsiniz)

dev_update_window ('off')
dev_close_window ()
read_image (Image, 'trees.png')
get_image_pointer1 (Image, _, _, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Region, 230, 255)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, Back, 'max_area', 0)
dilation_circle (Back, RegionDilation, 3.5)
paint_region (RegionDilation, GrayImage, GrayImageFilled, 0, 'fill')
info_smooth ('deriche2', 0.0655, Size, Coeffs)
smooth_image (GrayImageFilled, ImageMean, 'deriche2', 0.0655)
invert_image (ImageMean, ImageInvert)
watersheds_threshold (ImageInvert, Basins, 18)
dev_set_colored (6)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Image)
dev_display (Basins)
count_obj (Basins, NumberOfTrees)
disp_message (WindowHandle, 'Number of trees: '+NumberOfTrees, 'window', 12, 12, 'black', 'true')

Çatlak, Çizik, Çizgi vs. bulma

Genelde gözle dahi zor görülen çatlak, çizgi, çizik vs. bulunması işlemi bazen oldukça baş ağrıtıcı olabilir. Cam çatlağı bulunması, ahşap ya da mermer yüzeyde damarların kontrolü, tıbbi görüntüler, metalik yüzeydeki çiziklerin tesbiti gibi örneklerde karşımıza sıkça çıkan bu uygulamalarda alınan  görüntünün hem arka zemini ile uğraşmak (görüntüye giren yansımalar, noktacık şeklindeki tozlar vs. ayrıştırılmalı) hem de ön plandaki çizgiler hassas olarak seçilebilmelidir.
Uygulamaya göre pek çok farklı yaklaşım getirilmekle birlikte, bu tür uygulamalarda

  • Gauss Filtresi Uygulama
  • Gradient Domain Manipulation tekniği uygulama
  • Photometric stereo yöntemine göre görüntü alma

vb yöntemler ilk akla gelenlerdir.

Yukardaki resimde görüldüğü gibi, lines gauss bize çizgileri, gradient_domain işlemi ise arka zemin temizlemeyi ve çizgileri belirginleştirmeyi göstermektedir. Her iki tekniğin de HALCON kurulumu ile gelen angio-part isimli resme uygulandığı HALCON programcığı ise aşağıdadır. Kendi örneklerinizde uygulamalar daha komplike olacaktır.

(gradient domain manipulation tekniği, zemin üzerindeki resim üzerinde yer alan, genelde istenmeyen lekelerin elenmesi ve ön plana çıkartılmak istenen yerlerin belirginleştirilmesi suretiyle resmin yumuşatılması işlemidir. Bazı durumlarda çok iyi sonuçlar verebilmektedir.)

dev_update_off ()
dev_close_window ()
read_image (Angio, 'angio-part')
get_image_size (Angio, Width, Height)
dev_open_window (0, 0, 3*Width/2, 3*Height/2, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
lines_gauss (Angio, Lines, 2.3, 0.0, 0.7, 'dark', 'true', 'parabolic', 'true')
dev_display (Angio)
dev_set_color ('green')
dev_display (Lines)
disp_message (WindowHandle, 'X-Ray image with extracted contours', 'window', 20, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop()
*
gen_image_const (DX, 'real', Width, Height)
gen_image_const (DY, 'real', Width, Height)
count_obj (Lines, Number)
*
for I := 1 to Number by 1
    select_obj (Lines, Line, I)
    get_contour_xld (Line, Row, Col)
    if (|Row| < 10)
        continue
    endif
    get_contour_attrib_xld (Line, 'angle', Angle)
    get_contour_attrib_xld (Line, 'width_left', WidthL)
    get_contour_attrib_xld (Line, 'width_right', WidthR)
    get_contour_attrib_xld (Line, 'contrast', Attrib)
    * To process the lines, the point at which the gray value drops to
    * 25% of the contrast between the line and the background will be
    * displayed.  This point is given by sqrt(3/4) for the parabolic
    * line model.
    RowR := Row+cos(Angle)*WidthR*sqrt(0.75)
    ColR := Col+sin(Angle)*WidthR*sqrt(0.75)
    RowL := Row-cos(Angle)*WidthL*sqrt(0.75)
    ColL := Col-sin(Angle)*WidthL*sqrt(0.75)
    tuple_max ([RowR,RowL], Max)
    tuple_max ([ColR,ColL], Max2)
    if (Max < Height and Max2 < Width)
        set_grayval (DX, int(RowR), int(ColR), Attrib*sin(Angle))
        set_grayval (DY, int(RowR), int(ColR), Attrib*cos(Angle))
        set_grayval (DX, int(RowL), int(ColL), -Attrib*sin(Angle))
        set_grayval (DY, int(RowL), int(ColL), -Attrib*cos(Angle))
    endif
endfor
real_to_vector_field (DY, DX, VectorField, 'vector_field_relative')
reconstruct_height_field_from_gradient (VectorField, SmoothedImages, 'poisson', [], [])
dev_display (SmoothedImages)
disp_message (WindowHandle, 'Smoothed image', 'window', 20, 12, 'black', 'true')

Gradient domain manipulation allows strong image smoothing simply by suppressing all gradients below a certain threshold.

As result, only strong edges remain while small changes (which are typically caused by noise) are removed.