Cara mendeteksi tepi dan persegi panjang

14

Saya mencoba mendeteksi persegi panjang dalam gambar. Latar belakang gambar adalah satu warna (sebagian besar waktu). Saya mencoba dua metode untuk mendapatkan gambar biner (1 = latar belakang, 0 = tepi), untuk melakukan Transformasi Hough nanti ...

  1. Sobel atau Canny Filter

  2. Gambar halus A, Buat gambar perbedaan A - gauss, Buat gambar biner dengan ambang batas (Buat Histogram, nampan tertinggi harus menjadi latar belakang ...)

Hasilnya adalah gambar biner dengan tepi. Saya tidak benar-benar sekarang metode mana yang bekerja lebih baik untuk berbagai gambar yang berbeda. Ada ide?

Martin Thompson
sumber
1
Apa yang Anda maksud dengan "bekerja lebih baik"? Canny sangat populer untuk hal semacam ini, tetapi itu tergantung pada apa yang Anda coba lakukan setelah Anda memiliki keunggulan. Apa yang sebenarnya ingin Anda capai?
Paul R
4
Harap jangan memilih pengguna baru untuk pertanyaan pertama mereka di komunitas!
1
Utas ini mungkin berguna- dsp.stackexchange.com/questions/2975/…
Jim Clay
Detektor tepi menjelaskan: dsp.stackexchange.com/q/74/1273
penelope
"Hasilnya adalah gambar biner dengan tepi. Aku tidak benar-benar sekarang metode mana yang bekerja lebih baik untuk berbagai gambar yang berbeda. Ada ide?" Mungkin Anda memerlukan beberapa lib tes gambar untuk menemukan jawabannya atau mengambil beberapa gambar di lingkungan yang mungkin Anda hitung. Jika ada algoritma terbaik di bidang ini, mengapa kita harus belajar banyak yang lain? Saya percaya ada algoritma yang kadang-kadang memiliki kelebihan, dalam arti probabilitas.

Jawaban:

10

Saya pernah menulis aplikasi untuk deteksi persegi panjang. Ini menggunakan deteksi tepi Sobel dan transformasi garis Hough.

Alih-alih mencari puncak tunggal dalam gambar Hough (garis), program mencari 4 puncak dengan jarak 90 derajat di antara mereka.

Untuk setiap kolom dalam gambar Hough (sesuai dengan beberapa sudut), tiga kolom lainnya dicari untuk maksimum lokal. Ketika puncak satifactory ditemukan di masing-masing dari empat kolom, persegi panjang telah terdeteksi.

Program ini membangun persegi panjang dan melakukan pemeriksaan tambahan untuk konsistensi warna di dalam dan di luar persegi panjang untuk membedakan positif palsu. Program ini untuk mendeteksi penempatan kertas dalam lembar kertas yang dipindai.

Libor
sumber
5

Anda mungkin menemukan bahwa pendeteksi tepi Laplacian of Gaussian adalah pilihan yang lebih baik. Ini akan memberi Anda kontur tertutup lebih sering daripada detektor tepi Canny. Saya percaya itulah yang Anda inginkan karena langkah Anda selanjutnya adalah menerapkan transformasi Hough.

chippies
sumber
2

Mungkin bermanfaat untuk Anda tetapi sudah terlambat ketika saya mengunjungi situs ini hari ini

        Bitmap bmp=new Bitmap(pictureBox1.Image);
        int x1=0, x2=0, y1=0, y2=0;            
        for (int i = 1; i < bmp.Height;i++ )
        {                
            for (int j = 1; j < bmp.Width;j++ )
            {
                if( bmp.GetPixel(j,i).R<7  &&  bmp.GetPixel(j-1,i).R>240  && bmp.GetPixel(j,i-1).R>240 ){

                    for (int k = j; k < bmp.Width - 1;k++ )
                    {

                        if ((bmp.GetPixel(k, i).R < 7) && (bmp.GetPixel(k+1, i).R > 240) && (k-j>30)) {
                            int count1 = 0;

                            for (int g = j; g < k;g++ ){
                                if(bmp.GetPixel(g,i).R<7){
                                    count1++;                                    
                                }
                            }//get total width

                         if(count1==k-j){                                 
                             x1 = j;
                             y1 = i;
                             x2 = k;
                         }
                        }
                    }
                         for (int a = i; a < bmp.Height - 1;a++ )
                         {
                             if ((bmp.GetPixel(j, a).R < 7) && (bmp.GetPixel(j, a+1).R > 240) && (a- i > 30)) {

                                 int count2 = 0;

                                 for (int x = i; x < a;x++ )
                                 {
                                     if(bmp.GetPixel(j,x).R<7){                                            
                                         count2++;
                                     }
                                 }


                                 if (count2 == (a - i))
                                 {

                                     y2 = a;
                                 }
                                 else {
                                     Console.WriteLine("check");
                                 }
                             }

                         }

                         if ((bmp.GetPixel(x2, y2).R < 7) && (bmp.GetPixel(x2 + 1, y2).R > 240) && (bmp.GetPixel(x2, y2+1).R > 240))
                         {

                             bool r1 = false;
                             bool r2 = false;
                             int count3 = 0;
                             for (int y = y1; y < y2;y++ )
                             {
                                 if(bmp.GetPixel(x2,y).R<7){
                                     count3++;                                     
                                 }
                             }

                             if (count3== y2 - y1) {
                                 r1 = true;
                             }                                
                             if(r1==true){
                                 int count4=0;
                                 for (int x = x1; x < x2;x++ )
                                 {
                                     if(bmp.GetPixel(x,y1).R<7){
                                         count4++;
                                     }
                                 }

                                 if(count4==x2-x1){
                                     r2 = true;
                                     Console.WriteLine("values :  X1 " + x1 + "   y1 :" + y1 + "   width : " + (x2 - x1) + "  height :  " + (y2 - y1));
                                     Pen pen = new Pen(Color.Red, 2);
                                     pictureBox1.CreateGraphics().DrawRectangle(pen, x1, y1, x2 - x1, y2 - y1);
                                 }                     
                             }
                            }

                }

                    }// initial point loop




                }// first if
Zunera Altaf
sumber
2
Selamat datang di dsp.stackexchange :) Jawaban apa pun, bahkan yang terlambat, sangat disambut baik, tetapi alangkah baiknya jika Anda memberikan konteks dengan jawaban Anda. Jawaban yang memberikan penjelasan dan sumber lebih disukai - dapatkah Anda mengedit jawaban Anda, menulis beberapa kalimat tentang apa yang dilakukan kode dan bagaimana itu akan membantu masalah yang ditanyakan, dan mungkin mengutip sumbernya jika bukan Anda? Jika akan membuat jawaban Anda jauh lebih baik. Juga, harap edit identitas Anda - Saya sudah mencoba, tetapi saya tersesat setelah melewati sepertiga kode Anda.
penelope
0

Jika gambar Anda relatif bersih, Anda memiliki persegi panjang yang jelas tanpa banyak istirahat alternatif untuk transformasi Hough adalah membuat kontur dan menguranginya sampai mereka membentuk 4 sisi kontur = persegi panjang Anda.

Ada sampel terbuka untuk melakukan ini

Martin Beckett
sumber