Thông báo

Collapse
No announcement yet.

Edge detection

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Edge detection

    Hiện mình đang làm đề tài Edge detection .Đến phần DSP thì gặp nhiều lỗi quá bác nào làm rồi chỉ giáo cái
    ??? Undefined function or variable 'simulink'. << cứ gặp lỗi này.Trên altera thì có sẵn Edge detection project rồi

  • #2
    De lam edge detection. Bạn dùng một con D_FF. Ban vui long noi ro detect canh len hay canh xuong nhe. Se chi them do. De lam chi can dung tin hieu cua D va Q cua DFF la detect duoc.

    Comment


    • #3
      Ủa, bác nói Edge detection là detect cạnh của xung clock hay là detect cạnh biên của ảnh vậy?
      Chuyện nhỏ như con thỏ,bắt thỏ mới là chuyện lớn!!!

      Comment


      • #4
        Nguyên văn bởi it4rb Xem bài viết
        Ủa, bác nói Edge detection là detect cạnh của xung clock hay là detect cạnh biên của ảnh vậy?
        Tôi nghĩ là bạn Phuanon nói về cạnh của ảnh. Cái này kô đơn giản đâu.
        Chúc một ngày vui vẻ
        Tony
        email : dientu_vip@yahoo.com

        Comment


        • #5
          Sorry nhé. Mình cứ nghĩ là bắt cạnh tín hiệu. Ai dè ra đang hỏi về phương pháp lọc biên ảnh.
          Để lọc biên ảnh có khá nhiều cách đó. Ở đây mình chỉ giới thiệu hai cách đơn giản nhất để mọi người tìm hiểu.
          1. Dùng mạch lọc thông cao và mạch lọc thông thấp. Kết quả của hai mạch lọc này trừ nhau ta sẽ có được biên của ảnh. Cách này hiệu quả không cao. Biên ảnh có thể được view bằng mắt, nhưng sử lý không triệt để lắm.
          2. Dùng mạch lọc sobel để tính Gradian của ảnh. Nếu Gradian lớn hơn một giá trị qui ước trước thì cho điểm ảnh đó bằng 0 (đen) hoặc 0xFF.. (trắng). Các điểm có Gradian nhỏ hơn thì có giá trị ngược lại. Tại các biên ảnh, gradian thường rất lớn nên với phương pháp này đảm bảo phát hiện được biên ảnh.
          Chúc thành công nha.

          Comment


          • #6
            Nguyên văn bởi phuanon Xem bài viết
            Hiện mình đang làm đề tài Edge detection .Đến phần DSP thì gặp nhiều lỗi quá bác nào làm rồi chỉ giáo cái
            ??? Undefined function or variable 'simulink'. << cứ gặp lỗi này.Trên altera thì có sẵn Edge detection project rồi
            Mình upload ví dụ của lọc Sobel cho bạn xem thử.
            Chúc một ngày vui vẻ
            Tony
            email : dientu_vip@yahoo.com

            Comment


            • #7
              Nguyên văn bởi tonyvandinh Xem bài viết
              Mình upload ví dụ của lọc Sobel cho bạn xem thử.
              typedef int dType;

              int clipo(int i){
              int tmp;
              if(i<0)
              tmp = 0;
              else if(i > 127)
              tmp = 127;
              else
              tmp = i;
              return tmp;
              }

              int abso(int i){
              if(i<0)
              return -i;
              else
              return i;
              }
              const int cx[3][3] = {-1,0,1,-2,0,2,-1,0,1};
              const int cy[3][3] = {1,2,1,0,0,0,-1,-2,-1};

              void sobel_orig(dType din[128][128], dType dout[128][128]){
              int Gx,Gy;
              int tmpx,tmpy;

              ROW:for(int i=0;i<128;i++){
              COL:for(int j=0;j<128;j++){
              tmpx = 0;
              tmpy = 0;
              for(int r=0;r<3;r++){
              for(int c=0;c<3;c++){
              tmpx += din[clipo(i+r-1)][clipo(j+c-1)]*cx[r][c];
              tmpy += din[clipo(i+r-1)][clipo(j+c-1)]*cy[r][c];
              }
              }
              Gx = tmpx;
              Gy = tmpy;
              dout[i][j] = abso(Gx) + abso(Gy);
              }
              }
              }

              #include <stdio.h>
              #include "sobel.h"
              #include <math.h>
              #include <stdlib.h>

              void sobel_orig(dType din[128][128], dType dout[128][128]);
              int main()
              {
              dType din[128][128];
              dType dout[128][128];
              dType dout_orig[128][128];

              for(int i=0;i<128;i++)
              for(int j=0;j<128;j++)
              din[i][j] = rand();

              printf("Start processing \n");

              sobel_orig(din,dout_orig);

              for(int i=0;i<128;i++)
              for(int j=0;j<128;j++)
              printf("i=%d j=%d %d\n",i,j, dout_orig[i][j]);
              }
              Chúc một ngày vui vẻ
              Tony
              email : dientu_vip@yahoo.com

              Comment


              • #8
                Dùng mạch lọc sobel để tính gradian đại khái là giống vậy đó. Tiếp theo là cần so sánh giá trị "dout[i][j] = abso(Gx) + abso(Gy);" với một ngưỡng nào đó để xác định có phải là biên không.
                Lý giải mình search nhanh trên google nè: http://cntt.tv/nodes/show/53

                Ý tưởng cơ bản của Edge Detection là nếu 1 điểm nằm trên đường viền (edge) giữa 2 vật thì các điểm 2 bên của nó có sự sai khác về độ sáng lớn. Ví dụ những điểm trên mũ của của cô Lena có màu khác với hình nền phía sau nên vành mũ sẽ là đường viền, nơi chia cắt 2 vật (mũ và nền) có độ sáng khác nhau. Chúng ta chỉ cần lấy 1 điểm làm trung tâm, tính toán sự sai khác về độ sáng giữa các điểm xung quanh nó, nếu vượt qua 1 ngưỡng nào đó (threshold) thì điểm được chọn sẽ là điểm nằm trên đường viền.


                Có nhiều công thức được đưa ra, trong đó có công thức của Sobel mà người ta hay gọi là Sobel Filter. Sobel Filter là một ma trận 3×3, ví dụ như sau 1 2 1 0 0 0 -1 -2 -1Nhìn vào ta thấy hàng ở giữa đều là 0, nghĩa là ma trận này dùng để tìm đường viền ngang. Tương tự như vậy 1 0 1 2 0 -2 1 0 1dùng để tìm đường viền dọc. Có tất cả 8 hướng nên sẽ cần 8 ma trận.
                Chương trình demo chỉ dùng 2 ma trận tìm đường viền dọc, ngang.
                • input
                  • Chuyển đổi ảnh màu thành đen trắng lưu vào mảng data
                • process
                  • Tạo một mảng mới dataOut để lưu kết quả xử lý
                  • Áp dụng công thức của Sobel Filter để tính.
                  • Chú ý là ta bỏ qua các pixel nằm ngoài đường viền nên columns, rows phải trừ đi 2 **Những điểm có giá trị vượt quá THRESHOLD thì đổi sang màu trắng (đường viền), còn lại thì để nguyên màu đen (hình nền)
                • output
                  • Xuất kết quả ra file ảnh
                Chương trình demo và hình mẫu để ở đây. Nếu bạn đã cài Ruby, ImageMagick, RMagick thì lưu 2 file trên vào 1 thư mục rồi gõ lệnh “ruby sobel.rb” là chạy được

                Comment

                Về tác giả

                Collapse

                phuanon Điện tử 5 - K50 BKHN Tìm hiểu thêm về phuanon

                Bài viết mới nhất

                Collapse

                Đang tải...
                X