Hướng dẫn discrete gaussian kernel python - python hạt gaussian rời rạc
Tôi đang tìm cách thực hiện hạt nhân Gaussian rời rạc theo định nghĩa của Lindeberg trong công việc của mình về lý thuyết không gian quy mô. Show Nó được định nghĩa là t (n, t) = exp (-t)*i_n (t) trong đó i_n là hàm bessel đã sửa đổi của loại đầu tiên. Tôi đang cố gắng thực hiện điều này trong Python bằng cách sử dụng Numpy và Scipy nhưng đang gặp phải một số rắc rối.
Tôi thử âm mưu với:
Đầu ra trông giống như: Từ bài viết Wikipedia, nó sẽ trông giống như: Tôi cho rằng tôi đang mắc một số sai lầm thực sự tầm thường. :/ Bất kỳ suy nghĩ? Cảm ơn! EDIT: Những gì tôi đã viết tương đương với Sử dụng bộ lọc/kernel Gaussian để làm mịn/làm mờ hình ảnh là một công cụ rất quan trọng trong tầm nhìn máy tính. Bạn sẽ tìm thấy nhiều thuật toán sử dụng nó trước khi thực sự xử lý hình ảnh. Hôm nay chúng tôi sẽ áp dụng làm mịn Gaussian cho một hình ảnh bằng cách sử dụng Python từ đầu và không sử dụng thư viện như OpenCV. Các bước cấp cao:Có hai bước cho quá trình này:
Kernel/bộ lọc Gaussian:Tạo một hàm có tên
Tạo một vectơ có số cách đều nhau bằng cách sử dụng đối số kích thước được truyền. Khi
Bây giờ chúng tôi sẽ gọi hàm
Sau đó, chúng tôi sẽ tạo sản phẩm bên ngoài và bình thường hóa để đảm bảo giá trị trung tâm luôn là 1. Đầu ra kernel:Để đặt Sigma tự động, chúng tôi sẽ sử dụng phương trình sau: (Điều này sẽ hoạt động cho mục đích của chúng tôi, trong đó kích thước bộ lọc nằm trong khoảng từ 3-21):
Dưới đây là đầu ra của các kích thước kernel khác nhau. Như bạn đang thấy giá trị dnorm()
Đây là hàm 0. Chỉ cần tính toán mật độ bằng cách sử dụng công thức của 1.Cắt tích hợp và trung bình:Chúng tôi sẽ tạo chức năng tích chập theo cách chung để chúng tôi có thể sử dụng nó cho các hoạt động khác. Đây không phải là cách viết hiệu quả nhất để viết hàm tích chập, bạn luôn có thể thay thế bằng một cách được cung cấp bởi thư viện. Tuy nhiên, mục tiêu chính là thực hiện tất cả các hoạt động cơ bản từ đầu. Tôi sẽ không đi chi tiết về hoạt động 2 (hoặc 3), vì đã có nhiều hướng dẫn tuyệt vời có sẵn. Ở đây chúng tôi sẽ chỉ tập trung vào việc thực hiện.Hãy cùng xem xét chức năng 4 từng phần.
Hàm có hình ảnh và kernel là các tham số cần thiết và chúng tôi cũng sẽ vượt qua mức trung bình dưới dạng đối số thứ 3. Đối số trung bình sẽ chỉ được sử dụng để làm mịn bộ lọc. Lưu ý, chúng ta thực sự có thể vượt qua bất kỳ bộ lọc/kernel nào, do đó hàm này không được ghép nối/phụ thuộc vào hàm Vì chức năng 4 của chúng tôi chỉ hoạt động trên hình ảnh với kênh đơn, chúng tôi sẽ chuyển đổi hình ảnh thành tỷ lệ màu xám trong trường hợp chúng tôi tìm thấy hình ảnh có 3 kênh (hình ảnh màu). Sau đó vẽ hình ảnh tỷ lệ màu xám bằng cách sử dụng 7.
Chúng tôi muốn hình ảnh đầu ra có cùng kích thước với hình ảnh đầu vào. Điều này được gọi là kỹ thuật là 8. Để làm như vậy, chúng ta cần phải đệm hình ảnh. Ở đây chúng tôi sẽ sử dụng 9, chúng tôi sẽ nói về các loại đệm khác sau này trong hướng dẫn. Bây giờ đối với 8, chúng ta cần tính toán kích thước của phần đệm bằng công thức sau, trong đó scipy.special.ive(n, t) 1 là kích thước của hạt nhân. \ (\ frac {(k-1)} {2} \) Trong hai dòng cuối cùng, về cơ bản chúng ta đang tạo ra một mảng 2D trống rỗng và sau đó sao chép hình ảnh vào vị trí thích hợp để chúng ta có thể áp dụng đệm trong đầu ra cuối cùng. Trong hình ảnh dưới đây, chúng tôi đã áp dụng một phần đệm 7, do đó bạn có thể nhìn thấy đường viền màu đen.
Bây giờ chỉ cần thực hiện hoạt động tích chập bằng hai vòng.
Để áp dụng hiệu ứng mịn/mờ, chúng tôi sẽ chia pixel đầu ra cho tổng số pixel có sẵn trong hạt nhân/bộ lọc. Điều này sẽ chỉ được thực hiện nếu giá trị của trung bình được đặt Cuối cùng chúng tôi được thực hiện với chức năng tích chập đơn giản của chúng tôi. Đây là hình ảnh đầu ra. gaussian_blur():Vì vậy, hàm 4.
main():Trong chức năng chính, chúng ta chỉ cần gọi chức năng
Conclusion:Như bạn đã nhận thấy, một khi chúng tôi sử dụng bộ lọc/kernel lớn hơn, có một đường viền màu đen xuất hiện trong đầu ra cuối cùng. Điều này là do chúng tôi đã sử dụng đệm 0 và màu của 0 là màu đen. Bạn có thể thực hiện hai chiến lược khác nhau để tránh điều này.
Mã đầy đủ:
Dự án trong GitHub:Vui lòng tìm dự án đầy đủ ở đây: |