2012-02-13 19 views
6

Thay vì phát hiện cạnh của hình ảnh 2D, tôi muốn phát hiện các cạnh trên mỗi hàng đơn lẻ (ví dụ: một dòng) của hình ảnh riêng biệt. Đó là phát hiện của các cạnh từ một vector 1D đầu vào có giá trị là cường độ pixel từ 0 đến 255 (hình dưới đây): enter image description herePhát hiện cạnh một chiều

Tôi muốn để phát hiện các cạnh lớn như xuất hiện trong đầu vào mẫu (hình dưới đây) enter image description here

+0

Cảm ơn mọi người vì câu trả lời. Xin vui lòng nếu bạn đi qua với bất kỳ ý tưởng mới hơn (1Dimal cạnh phát hiện) chia sẻ rằng ở đây quá. –

Trả lời

7

Một cách để có được kết quả mong muốn của bạn là để thích nghi với các máy dò cạnh Canny 2D như sau (mã trong Mathematica):

Thứ nhất, tính đạo hàm không gian sử dụng một bộ lọc hàm Gaussian, thiết lập các giá trị sigma so với quy mô của các cạnh bạn muốn phát hiện. Lấy giá trị tuyệt đối của kết quả.

d = [email protected][data, {{10, 5}}, 1]; 

Sau đó, xác định ngưỡng tự động để nhóm các giá trị phái sinh trước đó thành hai nhóm (ở đây sử dụng phương pháp của Otsu).

thrd = FindThreshold[d]; 

Sau đó, phát hiện các bước của giá trị phái sinh (chuyển tiếp vào/từ "băng chết").

steps = [email protected]`StepDetect[d, thrd]["NonzeroPositions"]; 

Tại thời điểm này, bạn có tận cùng các cạnh:

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}] 

enter image description here

Tùy chọn - có vẻ như đó là những gì bạn muốn - giữ chỉ kết thúc thấp nhất của cạnh. Clustering các điểm dữ liệu ở phần cuối của các cạnh hoạt động trong trường hợp này, nhưng tôi không chắc nó mạnh như thế nào.

t = [email protected][[steps]]; 
steps2 = Select[steps, data[[#]] <= t &]; 

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}] 

enter image description here

2

Vì vậy, bạn đang tìm kiếm một thay đổi cụ thể về độ dốc - tức là một thay đổi nhất định trong Y cho mỗi mẫu?

Không chỉ đơn giản là nhìn vào sự khác biệt trong Y giữa hai mẫu và nếu giá trị tuyệt đối của nó thay đổi nhiều hơn một số dấu giới hạn như là một cạnh?

+0

Không thực sự, nó sẽ không đơn giản chút nào. Để xem xét lại tại: http://en.wikipedia.org/wiki/Edge_detection (Tại sao phát hiện cạnh là một nhiệm vụ không tầm thường) –

+0

@Cgraphics: Trên hình ảnh bạn đăng một sự khác biệt đơn giản hoặc đạo hàm của toán tử gaussian nên hoạt động tốt . Nếu bạn nghĩ rằng "nó không đơn giản chút nào", hãy đăng dữ liệu thực tế mà bạn gặp phải sự cố. – Niki

+0

@nikie là hình ảnh thực tế, tuy nhiên nó cũng không đơn giản như việc áp dụng một ngưỡng đơn giản. Chúng ta cần phát hiện chính xác các cạnh không chỉ, nói, đếm chúng. –

1

Với độ tương phản tốt đẹp của các cạnh, có một giải pháp dễ dàng mà sẽ làm việc một cách mạnh mẽ: phát hiện tất cả các chuỗi đơn điệu của giá trị pixel (tăng hoặc giảm nghiêm). Bạn sẽ giữ các dãy có tổng chiều cao trên ngưỡng (50 trong trường hợp của bạn) để loại bỏ các đỉnh ồn ào.

Là sản phẩm phụ, bạn sẽ nhận được điểm bắt đầu và kết thúc (không chính xác nơi bạn mong đợi mặc dù vậy, nhưng điều này có thể được cải thiện nếu cần).

Mã vạch?

+0

Không thoát chính xác, tuy nhiên bạn có thể nghĩ nó là mã vạch màu –