Nói chung, phát hiện cạnh sôi xuống để phát hiện các khu vực của hình ảnh có giá trị độ dốc cao.
Trong trường hợp của chúng tôi, chúng tôi có thể xem độ dốc là đạo hàm của hàm hình ảnh, do đó độ lớn của độ dốc cung cấp cho bạn thông tin về mức độ hình ảnh của bạn thay đổi cục bộ (liên quan đến các pixel / tex lân cận).
Bây giờ, một cạnh là như bạn nói một dấu hiệu của sự gián đoạn, vì vậy bây giờ chúng tôi đã xác định độ dốc rõ ràng rằng thông tin này là tất cả những gì chúng tôi cần. Khi chúng tôi tìm thấy độ dốc của hình ảnh, vấn đề chỉ là áp dụng ngưỡng cho nó để có được giá trị nhị phân cạnh / không cạnh.
Làm thế nào để bạn tìm thấy gradient này thực sự là những gì bạn đang hỏi và tôi vẫn chưa trả lời :)
Rất nhiều cách! Đây là một cặp :)
Được xây dựng trong các chức năng đổ bóng
Cả hlsl và glsl đều cung cấp các hàm phái sinh. Trong GLSL, bạn có dFdx và dFdy cung cấp cho bạn thông tin độ dốc tương ứng theo hướng x và y. Thông thường các chức năng này được đánh giá trong một khối các mảnh 2x2.
Trừ khi bạn quan tâm đến một hướng duy nhất, một cách tốt để có một kết quả nhỏ gọn cho biết độ dốc trong vùng là băng thông mạnh đến mức nào mang lại cho bạn không gì khác ngoài tổng giá trị tuyệt đối của dFdy và dFdy.
Bạn có thể quan tâm đến một cạnh trên hình ảnh tổng thể hơn là trên một kênh cụ thể, vì vậy bạn có thể muốn chuyển đổi chức năng hình ảnh của mình thành luma. Với ý nghĩ này, khi phát hiện ra cạnh, trình tạo bóng của bạn có thể bao gồm một cái gì đó giống như:
float luminance = dot(yourFinalColour,vec3(0.2126, 0.7152, 0.0722));
float gradient = fwidth(luminance );
float isEdge = gradient > threshold;
Với ngưỡng cao, bạn sẽ tìm thấy các cạnh thô hơn và bạn có thể bỏ lỡ một số, ngược lại, với ngưỡng thấp, bạn có thể phát hiện các cạnh sai. Bạn phải thử nghiệm để tìm ra ngưỡng phù hợp hơn với nhu cầu của bạn.
Lý do tại sao các chức năng này hoạt động là đáng nói nhưng tôi không có thời gian cho nó bây giờ, tôi có thể cập nhật câu trả lời này sau :)
Không gian màn hình hậu xử lý
Bạn có thể thích hơn thế này, bây giờ lĩnh vực phát hiện Edge trong xử lý hình ảnh là vô cùng lớn. Tôi có thể trích dẫn cho bạn hàng chục cách hay để phát hiện cạnh theo nhu cầu của bạn, nhưng bây giờ hãy giữ nó đơn giản, nếu bạn quan tâm tôi có thể trích dẫn cho bạn nhiều lựa chọn hơn!
Vì vậy, ý tưởng sẽ tương tự như ở trên, với sự khác biệt là bạn có thể nhìn vào một vùng lân cận rộng hơn và sử dụng một tập các trọng số trên các mẫu sorrounding nếu bạn muốn. Thông thường, bạn chạy một tích chập trên hình ảnh của bạn với một hạt nhân cung cấp cho bạn kết quả là một thông tin độ dốc tốt.
Một lựa chọn rất phổ biến là nhân Sobel
Mà tương ứng cung cấp cho bạn độ dốc theo hướng x và y:
Bạn có thể lấy giá trị đơn ra khỏi gradient như G r a di e n t Mmột gn i t u de = ( G r a di e n tx)2+ ( G r a di e n ty)2-----------------------√
Sau đó, bạn có thể ngưỡng như cách tôi đã đề cập ở trên.
Hạt nhân này như bạn có thể thấy mang lại nhiều trọng lượng hơn cho pixel trung tâm, do đó, tính toán hiệu quả độ dốc + một chút làm mịn mà theo truyền thống sẽ giúp (thường hình ảnh được làm mờ gaussian để loại bỏ các cạnh nhỏ).
Những điều trên hoạt động khá tốt, nhưng nếu bạn không thích làm mịn, bạn có thể sử dụng hạt nhân Prewitt:
(Lưu ý tôi đang vội, sẽ viết văn bản có định dạng phù hợp thay vì hình ảnh sớm!)
Thực sự có rất nhiều hạt nhân và kỹ thuật để tìm phát hiện cạnh theo cách xử lý hình ảnh thay vì đồ họa thời gian thực, vì vậy tôi đã loại trừ các phương thức phức tạp hơn (chơi chữ không có ý định) vì có lẽ bạn sẽ ổn với các chức năng dFdx / y .