Gaussian Blur - Độ lệch chuẩn, Bán kính và Kích thước hạt nhân


18

Tôi đã triển khai trình tạo bóng mờ đoạn gaussian trong GLSL. Tôi hiểu các khái niệm chính đằng sau tất cả: tích chập, tách x và y bằng cách sử dụng tuyến tính, nhiều đường chuyền để tăng bán kính ...

Tôi vẫn còn một vài câu hỏi:

  • Mối quan hệ giữa sigma và bán kính là gì?

    Tôi đã đọc rằng sigma tương đương với bán kính, tôi không thấy sigma được thể hiện bằng pixel như thế nào. Hay "bán kính" chỉ là một tên cho sigma, không liên quan đến pixel?

  • Làm thế nào để tôi chọn sigma?

    Xem xét tôi sử dụng nhiều đường chuyền để tăng sigma, làm thế nào để tôi chọn một sigma tốt để có được sigma tôi muốn ở bất kỳ đường chuyền nào? Nếu sigma kết quả bằng căn bậc hai của tổng bình phương của sigmas và sigma tương đương với bán kính, thì cách nào dễ dàng để có được bán kính mong muốn?

  • Kích thước tốt cho kernel là gì và nó liên quan đến sigma như thế nào?

    Tôi đã thấy hầu hết các triển khai sử dụng kernel 5x5. Đây có lẽ là một lựa chọn tốt để thực hiện nhanh với chất lượng tốt, nhưng có lý do nào khác để chọn kích thước hạt nhân khác không? Làm thế nào để sigma liên quan đến kích thước hạt nhân? Tôi có nên tìm sigma tốt nhất để các hệ số bên ngoài kernel của tôi không đáng kể và chỉ cần bình thường hóa?

Câu trả lời:


21

Mối quan hệ giữa sigma và bán kính là gì? Tôi đã đọc rằng sigma tương đương với bán kính, tôi không thấy sigma được thể hiện bằng pixel như thế nào. Hay "bán kính" chỉ là một tên cho sigma, không liên quan đến pixel?

Có ba điều đang chơi ở đây. Phương sai, ( ), bán kính, và số lượng pixel. Vì đây là hàm gaussian 2 chiều, nên nói về ma trận hiệp phương sai . Tuy nhiên, vì có thể, ba khái niệm này có liên quan yếu.σ2Σ

Trước hết, gaussian 2 chiều được đưa ra theo phương trình:

g(z)=1(2π)2|Σ|e12(zμ)TΣ1 (zμ)

Trong đó là một vectơ cột chứa tọa độ và trong ảnh của bạn. Vì vậy, và là một vector cột việc hệ thống hóa giá trị trung bình của hàm gaussian của bạn, trong và hướng . x y z = [ x y ] μ x y μ = [ μ x μ y ]zxyz=[xy]μxyμ=[μxμy]

Thí dụ:

Bây giờ, chúng ta hãy nói rằng chúng ta đặt ma trận hiệp phương sai và . Tôi cũng sẽ đặt số pixel là x . Hơn nữa, 'lưới' của tôi, nơi tôi đánh giá bản PDF này, sẽ chuyển từ đến , ở cả và . Điều này có nghĩa là tôi có độ phân giải lưới là . Nhưng điều này là hoàn toàn tùy ý. Với các cài đặt đó, tôi sẽ nhận được hình ảnh hàm mật độ xác suất ở bên trái. Bây giờ, nếu tôi thay đổi 'phương sai', (thực sự, hiệp phương sai), như vậy μ = [ 0 0 ] 100 100 - 10 10 x y 10 - ( - 10 )Σ=[1001]μ=[00]1001001010xyΣ=[ 9 0 0 9 ]10(10)100=0.2Σ=[9009] và giữ mọi thứ khác như cũ, tôi lấy hình ảnh bên phải.

nhập mô tả hình ảnh ở đây

Số lượng pixel vẫn giống nhau cho cả hai, x , nhưng chúng tôi đã thay đổi phương sai. Giả sử thay vì chúng tôi thực hiện cùng một thử nghiệm, nhưng sử dụng x pixel thay thế, nhưng tôi vẫn chạy từ đến . Sau đó, lưới của tôi có độ phân giải . Nếu tôi sử dụng cùng hiệp phương sai như trước, tôi sẽ nhận được điều này:100 20 20 - 10 10 10 - ( - 10 )1001002020101010(10)20=1

nhập mô tả hình ảnh ở đây

Đây là cách bạn phải hiểu sự tương tác giữa các biến đó. Nếu bạn muốn mã, tôi cũng có thể đăng nó ở đây.

Làm thế nào để tôi chọn sigma?

Sự lựa chọn ma trận phương sai / hiệp phương sai của bộ lọc gaussian của bạn phụ thuộc rất nhiều vào ứng dụng. Không có câu trả lời đúng. Điều đó giống như hỏi người ta nên chọn băng thông nào cho bộ lọc. Một lần nữa, nó phụ thuộc vào ứng dụng của bạn. Thông thường, bạn muốn chọn bộ lọc gaussian sao cho bạn loại bỏ một lượng đáng kể các thành phần tần số cao trong hình ảnh của bạn. Một điều bạn có thể làm để có được một số đo tốt, đó là tính toán DFT 2D của hình ảnh của bạn và phủ các hệ số của nó với hình ảnh gaussian 2D của bạn. Điều này sẽ cho bạn biết những gì đồng hiệu quả đang bị phạt nặng.

Ví dụ, nếu hình ảnh gaussian của bạn có hiệp phương sai rộng đến mức nó bao gồm nhiều hệ số tần số cao của hình ảnh của bạn, thì bạn cần làm cho các phần tử hiệp phương sai của nó nhỏ hơn.


1
Những hình ảnh đó sẽ tốt hơn nếu họ sử dụng một bản đồ màu liên tiếp. máy bay phản lực là tồi tệ nhất.
endolith

@endolith "Tốt hơn" tùy thuộc vào ứng dụng. Tôi không sử dụng máy bay phản lực khi cần phân biệt tương phản thị giác. (Nóng thì tốt hơn). Mặc dù ở đây, thông điệp nằm trong kích thước của gaussian, vì vậy không có tác hại nào với máy bay phản lực. Cảm ơn các liên kết mặc dù.
Tarin Ziyaee

2
Đây là một câu trả lời độc đáo và thực sự tốt câu trả lời! Lấy hình ảnh phía trên bên trái, ví dụ. Rõ ràng rằng sự kết hợp của phương sai và kích thước hạt nhân sẽ là lãng phí, vì đó là hạt nhân 100x100 trong đó chỉ có trung tâm 30x30 (~ 9%) là khác không.
Adam Smith

4

Sigma tham số là đủ để xác định độ mờ Gaussian từ một quan điểm liên tục. Tuy nhiên, trong thực tế, hình ảnh và hạt tích chập là rời rạc. Làm thế nào để chọn một xấp xỉ rời rạc tối ưu của hạt nhân Gaussian liên tục?

Phép gần đúng rời rạc sẽ gần với hạt nhân Gaussian liên tục hơn khi sử dụng bán kính lớn hơn. Nhưng điều này có thể đến với chi phí của thời gian tính toán thêm.

Lý tưởng nhất, người ta sẽ chọn một giá trị cho sigma, sau đó tính bán kính cho phép biểu diễn trung thực hạt nhân Gaussian liên tục tương ứng. Đối với một lỗi gần đúng nhất định, sigma càng lớn thì bán kính phải càng lớn.

Thật thú vị, điều này có thể trở nên rất phức tạp để làm cho nó đúng. Khi xây dựng ma trận Gaussian, giải pháp tốt nhất để lấy mẫu hạt nhân liên tục hay có xấp xỉ tốt hơn không? Làm thế nào để bình thường hóa hạt nhân rời rạc được tính toán để cắt ngắn? Vân vân.

Như một tài liệu tham khảo, trong Mathicala, hàm GaussianMatrix có một số cách để tính toán một ma trận rời rạc Gaussian, ví dụ như sử dụng xấp xỉ Bessel rời rạc. Theo mặc định, radius = 2 * sigma, có nghĩa là với sigma = 1, ma trận sẽ là 5x5.


Đây là một câu hỏi khá cũ. Nhưng liệu bán kính 2 * sigma có dẫn đến ma trận là 9x9 không?
Logic ảo tưởng

@DelusionalLogic với sigma = 1, radius = 2, vì vậy ma trận sẽ có kích thước 4 nhưng cần kích thước lẻ nên kích thước 5x5. Ít nhất đó là cách tôi hiểu nó ..
Micka

Nếu bán kính là 2, vùng lân cận sẽ mở rộng pixel trung tâm thêm 2 pixel ở bên trái, 2 ở bên phải, v.v ... Đó chỉ là quy ước mà Mathicala sử dụng.
Matthias Odisio

2

Nó chỉ ra rằng các hàng của Tam giác Pascal xấp xỉ một Gaussian khá độc đáo và có lợi thế thực tế là có các giá trị nguyên có tổng bằng 2 (chúng ta có thể lưu trữ các giá trị này chính xác như số nguyên, giá trị điểm cố định hoặc số float). Ví dụ: giả sử chúng ta muốn xây dựng Hạt nhân Gaussian 7x7, chúng ta có thể làm như vậy bằng cách sử dụng hàng thứ 7 của tam giác Pascal như sau:

nhập mô tả hình ảnh ở đây

Lưu ý rằng bộ lọc này có ảnh hưởng tối thiểu ở các góc trong khi số nguyên còn lại có giá trị. Bạn có thể sử dụng giá trị trung bình 20/64 để xác định sigma độ lệch chuẩn tương ứng là 64 / (20 * sqrt (2 * pi)) = 1.276 cho Gaussian gần đúng trong trường hợp này. Bạn có thể vẽ biểu đồ Gaussian để thấy đây là một sự phù hợp tuyệt vời.

Vì vậy, điểm khởi đầu tốt để xác định độ lệch chuẩn hợp lý cho Hạt nhân Gaussian đến từ Tam giác Pascal (còn gọi là Hệ số nhị thức ) - cho bộ lọc (N + 1) x (N + 1) tương ứng với việc sử dụng xây dựng ở trên

nhập mô tả hình ảnh ở đây

GaussianMatrix của Wolfram Alpha [3] chỉ sử dụng r / 2 = 1.5. Thật kỳ lạ, GaussianMatrix [{3,1.276}] không mang lại bộ lọc 2D giống như của tôi và không phải là sau cho x, y trong khoảng từ -3 đến 3:

nhập mô tả hình ảnh ở đây

Tôi không chắc tại sao không? Bộ lọc 2D của tôi là một sự phù hợp tuyệt vời.

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.