Cách phát hiện các cạnh và hình chữ nhật


14

Tôi cố gắng phát hiện hình chữ nhật trong hình ảnh. Nền của hình ảnh là một màu (hầu hết thời gian). Tôi đã thử hai phương pháp để có được hình ảnh nhị phân (1 = nền, 0 = cạnh), để thực hiện Chuyển đổi Hough sau này ...

  1. Bộ lọc Sobel hoặc Canny

  2. Hình ảnh mượt mà A, Tạo hình ảnh khác biệt A - gauss, Tạo hình ảnh nhị phân có ngưỡng (Tạo biểu đồ, thùng cao nhất phải là nền ...)

Kết quả là một hình ảnh nhị phân với các cạnh. Bây giờ tôi không thực sự phương pháp nào hoạt động tốt hơn cho nhiều hình ảnh khác nhau. Có ý kiến ​​gì không?


1
"Làm việc tốt hơn" nghĩa là gì? Canny rất phổ biến cho loại điều này nhưng nó phụ thuộc vào những gì bạn đang cố gắng làm một khi bạn có các cạnh. Chính xác thì bạn đang cố gắng đạt được điều gì?
Paul R

4
Vui lòng không bỏ phiếu cho người dùng mới cho câu hỏi đầu tiên của họ trên cộng đồng!

1
Chủ đề này có thể hữu ích- dsp.stackexchange.com/questions/2975/ấc
Jim Clay

Dò cạnh giải thích: dsp.stackexchange.com/q/74/1273
penelope

"Kết quả là một hình ảnh nhị phân có các cạnh. Tôi thực sự không biết phương pháp nào hoạt động tốt hơn cho nhiều hình ảnh khác nhau. Có ý tưởng nào không?" Có lẽ bạn cần một số lib kiểm tra hình ảnh để tìm câu trả lời hoặc chụp một số hình ảnh trong môi trường mà bạn có thể đếm. Nếu tồn tại một thuật toán tốt nhất trong lĩnh vực này, tại sao chúng ta phải học nhiều thứ khác? Tôi tin rằng bất kỳ thuật toán nào đôi khi cũng có lợi thế của nó, theo nghĩa xác suất.

Câu trả lời:


10

Tôi đã từng viết một ứng dụng để phát hiện hình chữ nhật. Nó đã sử dụng phát hiện cạnh Sobel và biến đổi Hough dòng.

Thay vì tìm kiếm các đỉnh đơn trong hình ảnh Hough (dòng), chương trình đã tìm kiếm 4 đỉnh với khoảng cách 90 độ giữa chúng.

Đối với mỗi cột trong ảnh Hough (tương ứng với một số góc), ba cột khác đã được tìm kiếm cực đại cục bộ. Khi đỉnh satifactory được tìm thấy trong mỗi bốn cột, hình chữ nhật đã được phát hiện.

Chương trình đã xây dựng hình chữ nhật và thực hiện các kiểm tra bổ sung về tính nhất quán màu trong và ngoài hình chữ nhật để phân biệt các dương tính giả. Chương trình này là để phát hiện vị trí giấy trong các tờ giấy được quét.


5

Bạn có thể thấy rằng máy dò cạnh Laplacian của Gaussian là lựa chọn tốt hơn. Nó sẽ cung cấp cho bạn các đường viền kín thường xuyên hơn máy dò cạnh Canny. Tôi tin rằng đó là những gì bạn muốn vì bước tiếp theo của bạn là áp dụng biến đổi Hough.


2

Có thể nó hữu ích cho bạn nhưng đã quá muộn khi tôi truy cập trang web này ngày hôm nay

        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

2
Chào mừng bạn đến với dsp.stackexchange :) Bất kỳ câu trả lời nào, dù là câu trả lời muộn, đều rất đáng hoan nghênh, nhưng sẽ rất tuyệt nếu bạn cung cấp một số bối cảnh với câu trả lời của bạn. Câu trả lời cung cấp giải thíchnguồn được ưu tiên - bạn có thể chỉnh sửa câu trả lời của mình, viết một vài câu về mã mà nó làm và cách nó giúp giải quyết vấn đề được hỏi và có thể trích dẫn nguồn nếu đó không phải là bạn? Nếu sẽ làm cho câu trả lời của bạn tốt hơn nhiều. Ngoài ra, vui lòng chỉnh sửa danh tính của bạn - Tôi đã thử, nhưng tôi đã bị lạc sau khi trải qua một phần ba mã của bạn.
Penelope

0

Nếu hình ảnh của bạn tương đối sạch sẽ, bạn có các hình chữ nhật rõ ràng mà không bị phá vỡ nhiều thay thế cho biến đổi Hough là tạo các đường viền và giảm chúng cho đến khi chúng tạo thành một đường viền 4 mặt = hình chữ nhật của bạn.

Có mẫu opencv để làm điều này


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.