Làm cách nào tôi có thể vượt qua bộ lọc bằng cách chỉ giảm dữ liệu đỉnh?


16

Tôi có một hình ảnh 2D mà tôi muốn bộ lọc thông thấp, với các ràng buộc / số liệu chất lượng sau:

  1. Tôi không thể "thêm" ánh sáng vào hình ảnh, vì vậy mỗi pixel trong kết quả phải là <= pixel tương ứng trong đầu vào.
  2. Tần số cắt đường thông thấp phải là một tham số, để thử nghiệm với
  3. Áp dụng bộ lọc này nhiều lần sẽ không thay đổi kết quả theo một cách quan trọng.
  4. Thời gian để chạy thuật toán này (5 phút cho hình ảnh 5MPix có vẻ hợp lý)
  5. Giảm thiểu lượng ánh sáng được lọc đi.

Dưới đây là một số cách tiếp cận tôi đã thử, cùng với những thiếu sót của họ:

  1. Bộ lọc Gaussian như bình thường, sau đó kéo kết quả xuống để tuân thủ ràng buộc 1. Điều này tuân thủ rất tốt với 3 điểm đầu tiên, nhưng giảm nhiều ánh sáng hơn mức cần thiết.

  2. Ghép các parabolas "lên trên" qua các điểm "thấp" và parabolas "xuống dưới" giữa chúng để làm mịn. Điều này hoạt động rất tốt trong 1D, nhưng trước tiên áp dụng nó theo chiều ngang, sau đó theo chiều dọc tạo ra kết quả xấu trong 2D. Nó mất nhiều thời gian hơn, nhưng không quá lâu cho ứng dụng của tôi. Tuy nhiên, áp dụng lặp lại bộ lọc này sẽ thay đổi mạnh mẽ kết quả. Nếu đầu vào (1D) là một parabola "hướng xuống" hoàn hảo (hoàn toàn không nên lọc), nó sẽ được thay thế bằng 2 parabolas "hướng lên" ở đầu / cuối.

  3. Sử dụng một số dạng khác của các hàm "cơ bản" 2D và giải tuyến tính để tìm các tham số tối ưu. Đây chỉ là một ý tưởng, chưa được thực hiện / thử nghiệm.

Lĩnh vực kinh nghiệm xử lý tín hiệu của tôi hầu như chỉ là xử lý hình ảnh, vì vậy tôi hy vọng sẽ tìm thấy giải pháp thay thế cho vấn đề này với đầu vào của các chuyên gia hoạt động trong các lĩnh vực xử lý tín hiệu khác.

cập nhật 2011/08/18

Dựa trên các phản ứng hiện tại, tôi quyết định làm cho mọi thứ rõ ràng hơn một chút bằng cách thêm biểu đồ của một đầu vào điển hình và kết quả của 3 cách tiếp cận tôi mô tả ban đầu + các đề xuất tôi nhận được cho đến nay. Để dễ so sánh, tôi chỉ sử dụng lọc 1D trong các ví dụ này.

Dữ liệu đầu vào: Dữ liệu đầu vào

Bộ lọc Gaussian + đưa nó xuống để tuân thủ yêu cầu (1).
Bạn có thể thấy rằng việc hạ thấp nó sẽ dẫn đến việc giảm ánh sáng không cần thiết ở phía bên tay phải. gaussian được lọc

Parabolas
Theo như tôi nghĩ, điều này khá xuất sắc, thật đáng buồn là nó không dịch hoàn hảo thành 2D bằng cách áp dụng chiều ngang đầu tiên, sau đó là dọc. Trong trường hợp này, bạn cũng thấy tôi có thể đánh giá các parabon được trang bị ở độ phân giải dấu phẩy động, đây là một lợi ích nhỏ, nhưng không hoàn toàn bắt buộc. phù hợp parabola

Xói mòn thang độ xám
Dựa trên gợi ý từ rwong, tôi đã thử xói mòn thang độ xám. Tôi đã sử dụng một yếu tố cấu trúc với hình dạng parabol giống như parabolas "được trang bị" của tôi. Kết quả gần như giống hệt nhau, vì vậy điều này có vẻ đầy hứa hẹn. Tuy nhiên, vẫn còn một vài vấn đề: 1. Phần tử cấu trúc của tôi không "đủ lớn" (mặc dù nó đã rộng 801 pixel) 1. Tôi chỉ có parabolas "hướng lên", không có parabolas hướng xuống để làm trơn tru quá trình chuyển đổi từ một parabola tiếp theo. xói mòn màu xám

Lọc trung bình
Chỉ bao gồm cho sự hoàn chỉnh, nó không thực sự là những gì tôi muốn. Bộ lọc trung vị

dữ liệu thô
Tôi đã dán dữ liệu đầu vào thô + các lệnh python khác nhau lên pastebin, vì vậy bạn cũng có thể thử nghiệm cùng một dữ liệu.
http://pastebin.com/ASnJ9M0p


1
Bạn có thể giải thích thêm một chút về các hạn chế 1 và 5 không? Chúng có vẻ mâu thuẫn (từ cái nhìn đầu tiên).
Peter K.

Tôi có thể hiểu nhầm ý của bạn về "thuật toán này", nhưng 5 phút cho 5 MP có vẻ như rất nhiều cho việc áp dụng bộ lọc thông thấp.
bjoernz

Câu trả lời:


8

Thực sự có một phiên bản 2D cho nỗ lực số 2 của bạn - về mặt lý thuyết là tương tự, nhưng nó không thể được phân tách thành hai hoạt động 1D. Vui lòng đọc về "Lọc hình thái thang độ xám 2D". Nó nhanh hơn khớp đường cong.

Lọc trung bình cũng có thể hữu ích nếu bạn đang cố gắng loại bỏ các đốm. Một hình thức lọc trung bình tiên tiến hơn là "lọc thông thường".

Trong mọi trường hợp, yêu cầu số 1 có thể được đáp ứng một cách tầm thường bằng cách lấy tối thiểu pixel theo chiều giữa đầu ra và đầu vào. Đây là một tiêu chí chất lượng quan trọng, nhưng nó sẽ không giới hạn sự lựa chọn thuật toán.


Lọc Gaussian (và một số bộ lọc hữu ích khác) có thể được phân tách (đầu tiên từ các hoạt động 2D sang 1D, sau đó thông qua biến đổi Fourier), nhưng có nhiều kỹ thuật xử lý hình ảnh hữu ích khác không thể phân tách được, làm cho chúng chậm nhưng không giảm tính hữu dụng của chúng.


Xin chào, cảm ơn các con trỏ để lọc hình thái thang độ xám. Mô tả trên wikipedia có vẻ thú vị và tôi sẽ điều tra điều đó. Tuy nhiên, trong liên kết của bạn đến tài liệu OpenCV, tôi chỉ thấy các bộ lọc hình thái bình thường, không phải các bộ lọc thang độ xám. Tôi chắc chắn sẽ kiểm tra tùy chọn này và cho bạn biết kết quả. Cảm ơn.
Pieter-Jan Busschaert

6
Có gợi ý của rwong về lọc trung bình có giúp ích gì không? Giải thích thêm một chút về những gì bạn đang cố gắng đạt được bằng cách trình bày một ví dụ đơn giản về dữ liệu và ví dụ "giả mạo" về những gì bạn muốn nhận ra có thể giúp ích.
Peter K.

Tôi đã cập nhật câu hỏi của mình với dữ liệu mẫu + kết quả từ các đề xuất khác nhau. Tôi hy vọng mọi thứ rõ ràng hơn bây giờ.
Pieter-Jan Busschaert

2

Tôi đề nghị sử dụng một spline làm mịn.

Dưới đây là cách bạn có thể thực hiện việc này bằng Matlab với chức năng làm mịn spline mạnh mẽ SMOOTHN từ Matlab File Exchange (chứa mã nguồn đầy đủ, để bạn có thể triển khai lại ở một nơi khác nếu cần). Lưu ý rằng nó cũng hoạt động với dữ liệu n chiều:

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

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


Cảm ơn đề nghị của bạn, tôi sẽ điều tra nó. Từ biểu đồ của bạn, có vẻ như tôi cần một SmoothFactor cao hơn nhiều so với ví dụ của bạn. Cạnh dốc quanh x = 700 không bị xóa và sẽ hiển thị rõ ràng. Ngoài ra, vết sưng ban đầu trong x = [0, 400] hoàn toàn không bị xóa. Bạn có nghĩ rằng điều này sẽ có cùng một vấn đề như bất kỳ cách tiếp cận nào khác (bộ lọc thông thấp + di chuyển xuống) không? Bạn có thể thấy phần bù toàn cục giữa hai biểu đồ, có thể sẽ tăng lên khi tôi sử dụng smoothingFactor cao hơn.
Pieter-Jan Busschaert

@ Pieter-JanBusschaert: Ồ, tôi nghĩ rằng đỉnh đầu tiên bằng cách nào đó hữu ích cho bạn. Dù sao, tất cả bộ lọc thông thấp + di chuyển xuống sẽ gặp khó khăn với mức tăng dốc ở mức ~ 650: Họ sẽ làm cho phần này phẳng hơn, và do đó đường cong phải được di chuyển xuống rất nhiều. Bộ lọc trung bình theo sau là một spline làm mịn giúp một chút.
Jonas
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.