Masalah segmentasi gambar dari berbagai bahan


15

Hai CV / Komunitas Pengakuan Pola,

Saya punya masalah serius mengenai segmentasi gambar. Skenarionya adalah suasana di dalam tungku yang membuat kepalaku menjadi gila. Dan saya perlu mendeteksi kontur benda dari berbagai bahan (gelas, keramik, Al, Ir, ..) dalam waktu singkat (<10 detik) dan bukan hanya untuk satu kasing khusus. Saya juga memerlukan kontur dalam deretan piksel berurutan untuk kode. Oleh karena itu diperlukan kode rantai atau yang disebut border / contour, sehingga lubang terbuka tidak bagus. Di latar belakang adalah suara non linear, kira-kira debu, partikel atau yang lainnya, yang muncul dari waktu ke waktu.

Saran Matlab atau OpenCV dipersilakan.

Untuk membuatnya lebih jelas, saya telah memposting gambar lain dari tujuan saya dan objek setengah transparan, yang juga perlu dideteksi. Juga contoh lebih lanjut yang perlu diperhatikan. Contoh 1 contoh2 contoh3 contoh4

Seperti yang dapat Anda lihat di Gambar # 1, ada partikel di bagian kanan gambar dan dekat kontur luar bintang, yang merupakan objek. Kontras secara keseluruhan juga tidak terlalu bagus. Objek itu sendiri berdiri di bawah tanah, yang tidak relevan untuk deteksi kontur. Gambar # 2 menunjukkan objek halftransparan, yang juga dimungkinkan.

Saya ingin mencari kontur / keliling objek itu, seperti pada layar berikutnya (garis merah). Dua persegi panjang (kuning) menandai awal (kiri) dan titik akhir (kanan). Garis biru tidak dapat diabaikan. contoh2

Pada awalnya saya berpikir bahwa saya bisa menyelesaikan masalah atmosfer kotor hanya dengan filter. Tetapi setelah sejumlah waktu investasi yang terhormat, saya baru sadar, bahwa saya harus menghilangkan atau mengurangi suara secara signifikan untuk meningkatkan kontras latar depan dan latar belakang. Saya sudah mencoba banyak metode, seperti ekualisasi histogram, ekualisasi adaptif Otsu, filter linear (mis. Gauss), filter nonlinier (median, difusi), Kontur Aktif, k-Means, Fuzzy-c-means dan juga Canny untuk murni Deteksi Tepi dalam kombinasi dengan operator morfologi.

  • Canny: Partikel-partikel dan atmosfir menyebabkan lubang, tetapi saya membutuhkan kontur objek yang lengkap. Masih dengan penutupan, dilatasi operator morfologi tidak cukup baik. Canny masih memiliki hasil terbaik dari semua metode yang telah saya pelajari karena histeresis.
  • Kontur Aktif: Mereka bekerja pada tepi / gradien juga, mereka bertindak benar-benar gila setelah menginisialisasi di dalam objek, yang mungkin disebabkan oleh peta tepi yang menghasilkan objek 'terbuka'. Sejauh yang saya tahu kontur harus ditutup. Mencobanya dengan turunan yang berbeda (GVF / VFC / Classic Snake).
  • k-Means: Hasil termasuk suasana tungku, karena latar belakang berkabut. Sama untuk fuzzy-c-means. Saya memilih dua kelompok, karena memisahkan objek dari latar belakang. Lebih banyak kelompok mengarah pada hasil yang lebih lemah.
  • Histogram / Otsu: Karena intensitas abu-abu yang sangat dekat (imho!), Itu menggabungkan objek dengan latar belakang. Mencobanya dengan metode lokal dan global.
  • Filter: Terutama GLPF atau LPF lainnya mengolesi tepi, yang tidak begitu baik dan bahkan tidak mengurangi atmosfer berkabut.
  • Filter Non-Linier menjaga ujung-ujungnya. Kebanyakan dari mereka terlalu lama untuk menghitung gambar besar. Mengambil filter bilateral cepat untuk saat ini. Hasilnya lihat di bawah.

Oleh karena itu, tidak ada metode tunggal yang cukup baik untuk langkah-langkah pasca-pemrosesan, karena hasil yang diperoleh dari segmen objek miskin bersaing dengan algoritma yang ada. Algoritma yang ada sangat lokal dan karenanya bekerja untuk skenario yang sangat khusus ini.

Jadi saya bertanya kepada Anda, jika saya telah melewatkan sesuatu sepenuhnya ... Saya tidak memiliki ide lebih lanjut bagaimana memproses dan bagaimana saya harus mendapatkan hasil kontur yang baik, tanpa memiliki celah atau lubang .. Apakah mungkin tanpa membuat banyak perubahan pada CCD dan lingkungan fisik? Terima kasih sebelumnya!

Pendekatan Terakhir sejauh ini (setelah malam panjang bereksperimen dengan MO):

  • Filter Bilateral (pengawetan tepi, tetapi menghaluskan area homogen)
  • Canny (Sigma = 2, Threshold = [0,04 0,08])
  • Morfologi Operasi (MO): bwareopen, closing, remove&bridge
  • bwlabeluntuk memilih hanya perimeter kontur, yang menghilangkan suara yang tidak diinginkan. belum ada tangkapan layar yang diperbarui, tetapi berfungsi untuk bintang. kaca mendapat kontur dalam yang terhubung ke kontur outter, yang juga dapat dilihat pada screenshot di bawah ini.

Jadi saya takut bahwa saya memerlukan algoritma khusus untuk traversal kontur outter. Ini akan menjadi beberapa pencarian lingkungan searah / berlawanan arah jarum jam. Langkah searah jarum jam / berlawanan arah jarum jam dapat beralih, jika ada titik sudut. jika ada celah, tambah jari-jari dan lihat lagi. jika ada dua atau lebih poin berikut yang mungkin, ambil orang yang mendapat arah yang sama seperti sebelumnya. Menurut Anda, apakah algoritma mengikuti kontur ini masuk akal?

Tepi Kaca Bintang


Sudahkah Anda mencoba ambang adaptif? Anda sepertinya tidak menyebutkannya. Saya pikir OTSU harus bekerja entah bagaimana setelah mengeluarkan noise tetapi mungkin ambang adaptif lebih baik.
Rui Marques

Hai Rui, saya mencoba threshold adaptif dengan Ekstensi Matlab ini: Adaptive Thresholding Berikut adalah hasil untuk bermain-main dengan parameter jendela: 1 Coba 2 Coba 3 Coba Seperti yang Anda lihat, dengan peningkatan parameter bagian tengah berubah dari putih menjadi hitam (apa baik, imho) tetapi sisa latar belakang juga berubah menjadi hitam, apa yang buruk.
mchlfchr

3
Sudahkah Anda mencoba beberapa teknik reduksi gambar dasar? Seperti mengurangi koreksi bidang datar untuk menghilangkan kegelapan di kanan atas ( en.wikipedia.org/wiki/Flat-field_correction ). Juga, jika partikelnya statis, mereka akan segera dihilangkan. Kemudian, Anda dapat menggunakan metode deteksi tepi apa pun yang Anda inginkan ...
PhilMacKay

Hai Phil, sejauh yang saya ketahui dan seperti yang saya tahu, ada serangkaian gambar yang diambil sebelum benda masuk ke tungku. Oleh karena itu, jenis kalibrasi di sini. Saya akan berbicara dengan fisikawan yang bertanggung jawab atas CCD dan lingkungan pada hari Senin. Tetapi terima kasih atas sarannya, saya akan mencobanya!
mchlfchr

Gambar kedua yang Anda tambahkan terlihat sangat berbeda. Bisakah Anda memposting semua gambar yang mungkin?
Andrey Rubshtein

Jawaban:


2

Anda dapat mencoba yang berikut ini:


Hai oli, mengenai metode jarang: bisakah Anda lebih spesifik dari metode kode apa yang harus saya gunakan? Saya tidak terlalu jauh ke bagian itu dan saya tidak menemukan sesuatu yang membantu dalam dokumen tentang penghapusan atau pengaburan ... Terima kasih sebelumnya.
mchlfchr

1
Anda dapat menemukan versi "lebih mudah digunakan", di sana: lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli

maaf untuk mengeluh waktu lain ;-) ... apakah Anda memiliki sumber win32 juga? Terima kasih lagi!
mchlfchr

Saya affraid saya tidak ...
oli

2

Saya pikir Anda menyerah pada teknik ambang batas terlalu dini. Lihatlah histogram Anda, ini jelas tri-modal: (Saya menghapus kolom putih di sebelah kanan gambar Anda secara manual, saya berasumsi bahwa itu bukan bagian dari gambar - silakan ambil gambar ini sebelum menjalankan kode saya)

masukkan deskripsi gambar di sini

Lihatlah semua nilai dalam grup pertama:

masukkan deskripsi gambar di sini

Untuk menemukan mode dalam histogram tri-modal, dimungkinkan untuk menggunakan pengelompokan K-means dengan K=3intensitas. Kode Matlab berikut ditemukan th1=67pada kode Anda. Idenya adalah untuk mengasumsikan bahwa Anda memiliki 3 set, dan menghitung centroid tertimbang pada masing-masing. Kemudian, setiap level intensitas ditugaskan ke klusternya sendiri. Anda berhenti ketika centroid tertimbang berhenti bergerak. Ini adalah hasil dari menemukan dua ambang batas pada gambar Anda, ditunjukkan pada histogram.

masukkan deskripsi gambar di sini

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Memecahkan masalah setelah itu adalah sepotong kue, cukup lakukan beberapa operasi morfologis sederhana, seperti pembukaan.


1
Hai Andrey, tetapi bagaimana saya harus melakukan generalisasi dari ambang batas yang Anda sebutkan? Saya punya beberapa case, tidak hanya itu dan saya masih perlu otomatisasi. Dan Otsu Thresholding (fungsi di matlab) tidak memberi saya hasil yang baik. Ada petunjuk lebih lanjut? Salam
mchlfchr

Hai lagi, terima kasih sejauh ini, tetapi kodenya tidak berfungsi. Layar gambar kosong muncul. Mencoba dengan data asli saya (bitmap) dan PNG yang Anda posting di atas. Sementara itu saya sedang debug ...
mchlfchr

@ mchlfchr, apakah Anda memiliki kotak alat pemrosesan gambar? Jika tidak, Anda dapat beralih imhistkehist
Andrey Rubshtein

@mchlfchr, silakan lihat versi terbaru
Andrey Rubshtein

Andrey, jika saya memasukkan file bitmap asli, hasilnya seperti yang saya sebutkan di posting asal saya. Mungkin ini terjadi mengenai resolusi? Gambar sumber berukuran 576x768 piksel dan skala abu-abu (256). Inilah hasilnya, jika saya menggunakan fungsi Anda dengan gambar asli saya: i.imgur.com/UXALJ.png histogram-angka fungsi Anda: i.imgur.com/7RiPP.png Terima kasih atas bantuan Anda! salam
mchlfchr

1

Seperti yang disarankan di atas, thresholding dapat sangat efektif pada gambar ini, yang pada dasarnya adalah biner, kecuali bahwa ambang konstan tidak akan dilakukan karena pencahayaan yang tidak merata. Anda membutuhkan ambang batas adaptif.

Saran saya adalah melakukan rekonstruksi latar belakang dengan model sederhana (mungkin planar [3 DOF] atau quadradic [6 DOF]), dengan mengambil sampel sejumlah kecil nilai di wilayah terang. Yang terbaik adalah menggunakan ROI kecil untuk menghilangkan kebisingan. Kemudian koreksi bayangan dengan mengurangi (atau membagi dengan) nilai latar belakang.

Jika interaksi manusia bukan opsi, Anda dapat mengotomatiskan pencarian untuk area latar belakang dengan Otsu langsung pertama dan mempertimbangkan ROI seragam (varian rendah) di bawah ambang batas. Setelah rekonstruksi latar belakang pertama, Anda mungkin dapat meningkatkan dengan menerapkan proses ini ke gambar yang dikoreksi datar.

Seluruh proses dapat diterapkan untuk berjalan di bawah satu detik.


Hai Yves, pemrosesan otomatis lebih disukai. Aspek DOF menarik, tapi saya tidak yakin tentang metode Otsu, karena Otsu sendiri tidak berfungsi dengan baik. Apakah saya memahaminya dengan benar bahwa Anda ingin memilih area acak dari gambar dan kemudian Anda akan mengirik setelah nilai rata-rata atas semua area yang dipilih? Hormat kami
mchlfchr

1

Saya pikir cara terbaik adalah menggunakan kontur aktif. Jika Anda tidak mengetahui kontur aktif apa yang terlihat di video ini di youtube http://www.youtube.com/watch?v=ijNe7f3QVdA

Pada dasarnya, Anda perlu memberikan segmentasi inisialisasi dan itu akan meningkatkan bentuk. Saran saya adalah untuk salah satu metode yang dibahas pada posting ini dan menggunakan kontur aktif sebagai langkah ke-2 yaitu. sebagai langkah peningkatan.

Berikut ini adalah implementasi dari kontur aktif yang dapat Anda gunakan http://www.mathworks.com/matlabcentral/fileexchange/19567


Selamat datang di dsp.se :) Terima kasih telah berkontribusi, Anda memberikan jawaban yang bagus. Jika Anda ingin membuatnya lebih baik, saya pikir akan menarik untuk memberikan jawaban atas beberapa pertanyaan ini: Mengapa Anda pikir ini adalah pendekatan terbaik (mis. Anda memiliki pengalaman pribadi dengan tecnhique)? Menurut Anda, pendekatan mana yang sudah disarankan yang akan bekerja dengan baik bersama dengan saran Anda? Tawarkan penjelasan singkat tentang teknik ini, atau, jika Anda punya waktu, cobalah untuk memberikan hasil eksperimen menggunakan teknik pada contoh gambar yang disediakan. Dan bersenang-senanglah di dsp!
penelope

@mkuse, karena Anda mungkin telah membaca posting awal, saya sudah mencoba kontur aktif, dikombinasikan dengan pengurangan kebisingan dan peta tepi. hasilnya buruk dan memiliki run-time yang buruk untuk gambar besar.
mchlfchr

bagaimana kalau Anda melihat teknik pengurangan kebisingan. Anda dapat menemukan ringkasannya di sini: lnmiitdip.files.wordpress.com/2011/12/…
mkuse

1
@mkuse, saya sudah menyebutkan mekanisme yang telah Anda posting di file PPT Anda di posting awal saya. Saya mengedit posting awal saya, untuk membuatnya lebih jelas, jenis filter apa yang saya gunakan.
mchlfchr

0

Anda jelas tahu tentang apa yang Anda bicarakan tetapi Anda belum menyebutkan menggunakan ambang, khususnya apakah Anda mencoba menerapkan ambang global menggunakan Otsu untuk menghitung tingkat yang tepat, kemudian menemukan kontur dan memilih yang terbesar?

[Edit untuk menjelaskan]

Ambang global jelas tidak akan berfungsi karena graident yang terlihat di seluruh gambar.

Saya bermain cepat dengan ini dan menemukan bahwa jika Anda memecah gambar menjadi 6 potongan (2 baris dengan 3 kolom berukuran sama), kemudian lakukan perontokan menggunakan Otsu pada masing-masing dan kemudian pasang kembali, itu pekerjaan yang cukup baik untuk membersihkan gambar.

Masih ada beberapa artefak kecil di bagian kanan atas bintang.

Terjadi pada saya bahwa karena objek memiliki batas garis lurus, Anda mungkin ingin mempertimbangkan transformasi Hough untuk mengekstrak tepi ini, memotongnya untuk menemukan titik dan menggunakan hasilnya sebagai kontur objek Anda.


Hai Dave, saya mencoba Otsu, tetapi itu membawa efek bahwa latar belakang kanan atas menyatu dengan objek, yang benar-benar tidak dapat diterima.
mchlfchr

Hai Dave, Hough bukan pilihan, karena persyaratan run-time dan sejauh yang saya ketahui tentang HT, sangat memakan waktu untuk gambar besar.
mchlfchr

0

Apakah garis besarnya selalu garis lurus atau kurva yang dikenal?

Jika demikian maka daripada mencoba untuk mendapatkan setiap pixel di sepanjang tepi yang benar, saya akan menggunakan transformasi Hough untuk mendapatkan persamaan garis dan kemudian menciptakan kontur dari garis dan itnersections


1
Seperti yang telah saya sebutkan: Saya membutuhkan pendekatan real-time terdekat. Dan sejauh yang saya tahu HT, itu sangat memakan waktu. Aspek lain adalah, saya tidak tahu kurva dan garis tidak selalu lurus. Kontur tergantung pada bahan, yang ada di tungku (untuk informasi lebih lanjut, lihat posting asal saya).
mchlfchr

Untuk garis lurus cukup cepat, dan jika Anda tahu kira-kira di mana garisnya (misalnya dari bingkai sebelumnya), Anda hanya dapat mencari ruang paramter itu
Martin Beckett
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.