logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy?

Hopin 04 Lis 2007 14:49 8060 10
REKLAMA
  • #1 4445194
    Hopin
    Poziom 15  
    Posty: 75
    Pomógł: 20
    Ocena: 2
    Witam

    Pytanie do wszystkich zajmujących się obróbką obrazu, ale i nie tylko :D
    Może zacznę od początku. Zrobiłem program, który pobiera obraz z czytnika linii papilarnych i zapisuje go do pliku. Problem w tym że ten obraz nie jest idealny:
    Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy?

    Obraz ten jest w odcieniach szarości (0-255), i rozdzielczości 256x300. Myślę, że na początek trzeba go zamienić na obraz czarno biały, co też zrobiłem. Jednak nie wiem jak dalej postępować z tym obrazem, aby wyglądał np tak:

    Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy?

    Próbowałem zastosować różne filtry np. dolnoprzepustowy, medianowy, zamknięcie, otwarcie... Oraz kombinacje np. dolnoprzepustowy-zamkniecie, medianowy-otwarcie itd. jednak żaden nie przyniósł oczekiwanego przeze mnie rezultatu.

    Moje pytanie brzmi: Jakie filtry zastosować, lub jakie algorytmy aby uzyskać oczekiwany przeze mnie wynik :?:

    Dodam jeszcze, że program piszę w Visual C++, jednak to raczej nie ma znaczenia bo na razie chciałbym poznać teorie, a dopiero potem przełożyć to na język.

    Proszę o pomoc i pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 4448252
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    Nie konwertuj obrazu na czarno-biały, bo stracisz całą masę informacji.

    Generalnie próbowałbym w takim kierunku:

    1.Zwiększyć kontrast (i może trochę zmniejszyć jasność.. to już by pewnie zależało od danego zdjęcia i jego średniej jasności)

    2.Przepuścić przez filtr (mediana lub wprost filtr który np zwraca kolor czarny jeżeli 2-3 punkty w pobliżu są koloru czarnego/szarego)

    3.Teraz dopiero zamienić na obraz czarno-biały (generalnie można to zrobić łącznie z pkt. 2)

    Ewentualnie przed pkt. 2 możesz jeszcze spróbować jakiś filtr gaussa (generalnie rozmazanie) z tym tylko, że nakładasz wynikowy kolor tylko jeżeli jest ciemniejszy niż kolor oryginalny. Tak żeby pogrubić/wzmocnić już istniejące linie.
  • REKLAMA
  • REKLAMA
  • #4 4448747
    Hopin
    Poziom 15  
    Posty: 75
    Pomógł: 20
    Ocena: 2
    :arrow: KeinXor
    Binaryzacja raczej już jest zrobiona. Przecież odczytuje obraz i wyświetlam go na ekranie, poza tym zapisuje go w pliku oraz mogę odwołać się do konkretnego punktu w obrazie (inaczej nie mógłbym przetwarzać w żaden sposób tych danych, nakładać filtrów). W Visualu jest taka wartość BYTE która przechowuje wartości określonych pikseli.

    :arrow: MirekCz
    Tak w 100% zgadzam się z Tobą, że na początku nie można zamieniać na czarno-biały. Robię właśnie tak jak mówisz, najpierw przepuszczam przez filtr (filtry) a potem dopiero zamieniam na czarno-biały. Nie wiem czy to jest to samo co filtr Gaussa ale używałem filtru rozmywanie. Ale niestety nic ciekawego nie przyniósł. Poszukam jeszcze informacji o filtrze Gaussa. Bo właśnie chodzi też o to żeby pogrubić te linie, a najlepiej żeby były wszystkie takiej samej grubości.

    Dziękuje za odpowiedzi, i czekam na kolejne wskazówki i uwagi...
    Pozdrawiam
  • Pomocny post
    #5 4449962
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    siemanko,
    :arrow: Hopin, nie bardzo mogę się zgodzić z tobą i z tym co piszesz z tego co pamiętam to binaryzacja(progowanie) - kwalifikacja pikseli do zbioru których wartość przekracza lub jest równa zadanemu progowi.
    Jest książka "Praktyka przetwarzania obrazów w programie Matlab" której autorem jest mi. Dr Robert Koprowski.
  • Pomocny post
    #6 4451469
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    :arrow: Hoppin
    A może pokażesz nam jakie wyniki dają te filrty, które stosujesz. Bo może być tak, że ktoś tu się produkuje, a Ty masz zrobione to o czym mówimy i powinniśmy zająć sie następnym zagadnieniem. Bo z tego co tu czytam, to Twoj obraz jest przefiltrowany, a chodzi o to, żeby wynik filtracji jeszcze jakoś uregulować, by linie były ciągłe i równe.

    :arrow: KeinXor
    Co do binaryzacji, to jest to po prostu zamiana obrazu RGB, czy szarego na obraz czarno-biały. Patrząc na ten odcisk, próg byłby na pewno wysoki, gdyż obraz jest bardzo jasny. Może nawet bliski koloru białego.

    Pozdrawiam i powodzenia
  • #7 4451841
    Hopin
    Poziom 15  
    Posty: 75
    Pomógł: 20
    Ocena: 2
    Witam

    KeinXor masz rację, trochę się nie zrozumieliśmy.

    SirSimon się dopominał więc umieszczam :D Najlepsze wyniki jakie udało mi się osiągnąć. Jak można je jeszcze "obrobić" żeby linie oraz odstępy między nimi były takiej samej szerokości? Jakie rozwiązania jeszcze proponujecie?

    1. Filtr dolnoprzepustowy+otwarcie. || 2. Filtr medianowy+zamknięcie.
    Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy? Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy?

    Pozdrawiam
  • Pomocny post
    #8 4451921
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    Widzę, że niestety w niektórych miejscach się obraz zlewa. Może zanim zaczniesz filtrować obrazy, poddaj je procesowi szkieletyzacji (wynikiem są linie ciągłe grubości jednego piksela), a potem w jakiś sposób pogróbić, np. za pomocą dylatacji :?:
  • REKLAMA
  • #9 4515542
    Hopin
    Poziom 15  
    Posty: 75
    Pomógł: 20
    Ocena: 2
    Niestety, żaden filtr, kombinacja filtrów nie przynosi wyników przynajmniej zbliżonych do tych które chciałbym uzyskać :|
    Czytałem trochę na temat poprawy jakości obrazu linii papilarnych, i natrafiłem na "filtr Gabora", próbuje go teraz przełożyć na C++ jednak nie jest to łatwe, niby z matematycznego punktu widzenia wszystkie wzory są przełożone właściwie a filtr nie chodzi. I tutaj zwracam się z pytaniem.

    Może ktoś przede mną pracował z tym filtrem w C++? I może udało się komuś go uruchomić?

    Proszę o wszelką pomoc, pozdrawiam
  • #10 4531146
    And!
    Admin grupy Projektowanie
    Posty: 9061
    Pomógł: 175
    Ocena: 784
    Obrazek trafi zapewne na sieć neuronową,
    myślę że sieć powinna sobie poradzić nawet bez zaawansowanych technik obróbki.

    W jaki sposób odczytujesz dane z czytnika, ma jakiś standardowy interfejs (HID ?) ?
  • #11 4533003
    Hopin
    Poziom 15  
    Posty: 75
    Pomógł: 20
    Ocena: 2
    Witam
    Na podstawie biblioteki "libusb-win32" mam stworzony plik dll (sterownik) który obsługuje czytnik. Poprzez tę bibliotekę odwołuje sie do urządzenia i pobieram z niego dane. Mogę je wyświetlić na ekranie w normalnym ImageControl w Visualu C++ lub strumień ten od razu zapisać do pliku.

    Chciałem zrobić rozpoznawanie odcisków "typowym" algorytmem, tzn poprzez wyszukanie minucji ale do tego potrzebowałbym niemal idealnych linii na obrazie, wiec pewnie będę musiał zrobić tak jak radzisz... Czyli zastosować SSN.

    Pokaże jednak wynik jaki udało mi się uzyskać z filtru Gabora, obraz jest w połowie właśnie taki jaki chciałbym uzyskać.

    Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy? Jak poprawić jakość obrazu linii papilarnych w Visual C++? Filtry i algorytmy?

Podsumowanie tematu

✨ Dyskusja dotyczy poprawy jakości obrazu linii papilarnych pozyskiwanego z czytnika w programie napisanym w Visual C++. Obraz jest w odcieniach szarości o rozdzielczości 256x300, a celem jest uzyskanie wyraźnych, jednolitej grubości linii, podobnych do wzorców referencyjnych. Zalecane jest unikanie wczesnej binaryzacji, aby nie utracić informacji, zamiast tego proponuje się najpierw zwiększenie kontrastu, zastosowanie filtrów medianowego lub specjalnych filtrów lokalnych wzmacniających ciemne punkty, a dopiero potem binaryzację. Dyskutowano o filtrach dolnoprzepustowych, medianowych, morfologicznych (otwarcie, zamknięcie), filtrze Gaussa oraz szkieletyzacji i dylatacji w celu uzyskania ciągłych, cienkich linii, które można następnie pogrubić. Autor eksperymentował także z filtrem Gabora, który jest uznawany za skuteczny w poprawie jakości linii papilarnych, jednak implementacja w C++ sprawia trudności. Wskazano również na możliwość wykorzystania sieci neuronowych do przetwarzania obrazu. Dane z czytnika pobierane są za pomocą biblioteki libusb-win32 i zapisywane do pliku lub wyświetlane w Visual C++. Ostatecznym celem jest rozpoznawanie odcisków palców poprzez wykrywanie minucji, co wymaga niemal idealnej jakości linii na obrazie.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA