Tôi biết câu hỏi này là hơi cũ nhưng tôi cũng đã quan tâm đến việc lọc trung bình. Nếu một người đang làm việc với tín hiệu hoặc hình ảnh, thì sẽ có một chồng chéo lớn dữ liệu cho cửa sổ xử lý. Điều này có thể được lợi dụng.
tôi đã đăng một số mã chuẩn ở đây: 1D moving median filtering in C++
Nó mẫu dựa vì thế nên làm việc với hầu hết các loại dữ liệu POD.
Theo kết quả của tôi std::nth_element
có hiệu suất kém đối với một trung vị chuyển động, vì nó phải sắp xếp cửa sổ giá trị mỗi lần.
Tuy nhiên, bằng cách sử dụng một nhóm giá trị được sắp xếp, người ta có thể thực hiện trung vị với 3 thao tác.
- Hủy bỏ giá trị lâu đời nhất ra khỏi hồ bơi (gọi std :: LOWER_BOUND)
- Chèn giá trị mới vào hồ bơi (gọi std :: LOWER_BOUND)
- cửa hàng giá trị mới trong bộ đệm của History
Trung vị bây giờ là giá trị trung bình trong hồ bơi.
Tôi hy vọng ai đó thấy điều này thú vị và đóng góp ý tưởng của họ!
Bạn đã thử std :: nth_element? Đó là O (n) so với O (n log n) cho một quicksort. – smocking
Bạn không muốn sửa đổi thuật toán này để làm cho nó hoạt động với thời gian ngắn vì thời gian chạy trên mỗi pixel là tỷ lệ thuận với 2^n, trong đó n là số bit trong kiểu dữ liệu được sử dụng. 256 cho mảng 8 bit đã đủ đau đớn, bạn không muốn đi đến 65536 cho mảng 16 bit. Xem câu trả lời của tôi cho một thuật toán nhanh hơn, mặc dù nó là O (log r) trên mỗi pixel thay vì O (1). – HelloGoodbye
Nếu bạn không muốn lọc trung bình, đó là những gì bạn làm trong ví dụ về xử lý hình ảnh nơi bạn tìm thấy một trung vị cho từng pixel, nhưng chỉ muốn tìm một vị trí trung bình, nhận xét của @ smocking có liên quan. – HelloGoodbye