2010-01-18 36 views
5

Tôi đang thực hiện một số mã xử lý hình ảnh trong C#, nhưng tôi không thể sử dụng bất kỳ thư viện hoặc GNU nào như mã.Mã hóa UnsharpMask không có chức năng Fourier

Chức năng UnsharpMask phụ thuộc vào độ mờ Gaussian do đó phụ thuộc vào Biến đổi Fourier. Tôi đã viết mã cho tất cả điều này và mọi thứ đang làm việc, nhưng để làm cho một câu chuyện dài ngắn, tôi cần phải loại bỏ các chức năng FFT. Có cách nào để thực hiện mặt nạ unsharp theo một cách khác mà có lẽ không cần FFT?

+0

Tôi nghĩ rằng sẽ rất thú vị khi biết tại sao bạn không thể sử dụng các biến đổi của fourier để xem xét tốc độ tăng tốc lớn mà bạn có thể đạt được bằng cách sử dụng nó. –

+0

Về cơ bản nó đi xuống để kiểm tra đơn vị. Tôi giữ UnsharpMask xung quanh vì lý do di sản và hiếm khi được sử dụng. Tuy nhiên, để hỗ trợ một hàm như vậy, tôi phải tạo một lớp khá lớn để xử lý các hình ảnh định dạng số phức tạp và chức năng FFT, hoàn chỉnh với các bài kiểm tra. Đơn vị kiểm tra các FFT này là một nỗi đau thực sự nhưng sẽ không là vấn đề nếu chúng ta sử dụng UnsharpMask. – Jono

+0

Thay vì tìm cách thay thế FFT bằng một thứ gì đó khác, liệu có thể thay thế Gaussian blur bằng một cái gì đó khác và vẫn làm UnsharpMask không? – Jono

Trả lời

2

Tôi tìm thấy một giải pháp cho phù hợp với nhu cầu của tôi.

Tôi đã thử một số thuật toán làm mờ nhanh và bẩn và thấy cả hai Box BlurStack Blur là đủ. Stack Blur có một blur mờ hơn sau đó Box Blur và nhanh hơn nhiều lần Gaussian. Vì vậy, tôi có thể sử dụng một trong hai thay cho Gaussian.

Vì vậy, bây giờ tôi có thể loại bỏ tất cả các mớ hỗn độn mã FFT và thay thế bằng một thứ dễ quản lý hơn. Giải pháp này có thể không dành cho tất cả mọi người, nhưng vì UnsharpMask dựa trên làm mờ, tôi không cảm thấy rằng nó quá chính xác của một khoa học.

Bằng cách làm mờ Gaussian của GIMP dường như cũng tránh FFT.

+0

I ' ve thường sử dụng hộp blur hai lần hoặc thậm chí ba lần để có được một hình thức thô nhanh chóng làm mờ khi tôi cần phải unsharp số lượng lớn các hình ảnh tự động. – DarenW

+0

Tôi nghĩ rằng GIMP đang sử dụng xấp xỉ IIR cho Gaussian Blur. – Royi

3

Phần biến đổi Fourier của hiệu ứng Gaussian blur chỉ là một cách hiệu quả để thực hiện phép chập với hạt nhân Gaussian. Bạn có thể làm điều đó bằng cách sử dụng phép chuyển tiếp thẳng về phía trước với một hạt nhân Gaussian của độ lệch và kích thước chuẩn thích hợp (một hạt nhân có kích thước lẻ khoảng 5-6 lần độ lệch chuẩn là đúng).

Xem Convolution on Wikipedia.

+0

Câu trả lời hay. Bạn đang trao đổi một thuật toán O (nnn n) cho một thuật toán O (n * n) (chập trực tiếp) - do đó việc làm mịn hình ảnh 2D với sự chập chững trực tiếp sẽ chậm hơn đáng kể. Bạn có thể sao chép thuật toán FFT từ Numerical Recipes khá dễ dàng nếu tốc độ trở thành một vấn đề. – Paul

+0

Tôi tin rằng mã NR không phải là miễn phí cho sử dụng thương mại (mặc dù op không chỉ định tôi đoán nếu mã GNU là một vấn đề giấy phép NR có thể là tốt). –

0

Tôi tin rằng ngay cả khi bạn không thể sử dụng bất kỳ thư viện hoặc GNU thingy nào, bạn có thể xem xét triển khai của chúng và thử tạo lại mã tương tự cho các yêu cầu của bạn?

danh sách hàm openCV. kiểm tra các chi tiết chức năng ở đây và sau đó thực hiện các chi tiết trong các tập tin tiêu đề. http://opencv.willowgarage.com/documentation/genindex.html

Ngoài ra nếu bạn quan tâm đến C# dựa thi tôi xin đề nghị như sau http://aforgenet.com/framework/

+0

openCV có thể hoạt động. Aforge là LGPL mà tôi không thể sử dụng. Ngoài ra, tôi nhận thấy rằng nhiễu Gauss trong GIMP dường như không sử dụng FFT: http://git.gnome.org/browse/gimp/tree/plug-ins/common/blur-gauss.c – Jono

Các vấn đề liên quan