2015-05-30 15 views
6

Tôi có một loạt hình ảnh làm dữ liệu thô mà tôi đang cố gắng chuẩn bị xuất bản. Những hình ảnh này có một loạt các đốm trắng ngẫu nhiên trong suốt mà tôi muốn thay thế bằng mức trung bình của một số điểm ảnh xung quanh.Làm cách nào để tìm và xóa các đốm trắng khỏi hình ảnh bằng SciPy/NumPy?

tôi không thể đăng hình ảnh, nhưng đoạn mã sau nên tạo ra một PNG rằng xấp xỉ với vấn đề mà tôi đang cố gắng để sửa chữa:

import numpy as np 
from scipy.misc import imsave 

random_array = np.random.random_sample((512,512)) 

random_array[random_array < 0.999] *= 0.25 

imsave('white_specs.png', random_array) 

Trong khi điều này nên tạo ra một hình ảnh với một tương tự phân phối của các đốm có trong dữ liệu thô của tôi, hình ảnh của tôi không có các đốm sáng đồng đều về cường độ và một số đốm lớn hơn một pixel kích thước (mặc dù không có pixel nào lớn hơn 2). Ngoài ra, có những điểm trên hình ảnh của tôi mà tôi không muốn thay đổi được cố ý bão hòa trong khi thu thập dữ liệu nhằm mục đích rõ ràng khi được trình bày: những điểm này có đường kính xấp xỉ 10 pixel.

Về nguyên tắc, tôi có thể viết một cái gì đó để tìm các pixel có giá trị vượt quá một ngưỡng nhất định sau đó kiểm tra chúng so với mức trung bình của các nước láng giềng gần nhất. Tuy nhiên, tôi cho rằng những gì tôi đang cố gắng đạt được không phải là một hành động không phổ biến trong xử lý hình ảnh, và tôi rất nghi ngờ rằng có một số chức năng SciPy sẽ làm điều này mà không cần phải tái tạo lại bánh xe. Vấn đề của tôi là tôi không đủ quen thuộc với các khía cạnh chính thức/từ vựng của xử lý hình ảnh để thực sự biết những gì tôi nên tìm kiếm. Ai đó có thể chỉ cho tôi đi đúng hướng?

+3

Thao tác bạn đang tìm kiếm là thao tác _despeckle_. về cơ bản thay vì lấy trung bình của điểm ảnh với các điểm ảnh xung quanh, bạn lấy trung bình (của độ sáng). Có một ví dụ hay [ở đây] (https://github.com/niroyb/Despeckle/blob/master/despeckle.py). –

+3

Có một cách tiếp cận khác [ở đây] (http://www.websupergoo.com/helpie/source/2-effects/despeckle.htm) mà despeckles bằng cách phân tích độ lệch chuẩn, sau đó chỉ sử dụng một bộ lọc trung bình nếu độ lệch chuẩn thấp đủ. –

+0

Cảm ơn bạn đã đề xuất. Một người dùng khác đã đề xuất một SciPy tích hợp mà chỉ là thủ thuật. – PMende

Trả lời

9

Bạn chỉ có thể thử một bộ lọc trung bình với kích thước hạt nhân nhỏ,

from scipy.ndimage import median_filter 

filtered_array = median_filter(random_array, size=3) 

đó sẽ loại bỏ các đốm mà không thay đổi đáng kể ảnh gốc.

Một bộ lọc trung bình là rất thích hợp cho các nhiệm vụ như vậy vì nó sẽ bảo vệ tốt hơn các tính năng trong hình ảnh ban đầu của bạn với tần số không gian cao, khi so sánh ví dụ để một bộ lọc trung bình động đơn giản. Bằng cách này, nếu hình ảnh của bạn là thử nghiệm (tức là ồn ào) áp dụng một bộ lọc trung bình không tích cực (chẳng hạn như bộ lọc ở trên) không bao giờ đau vì nó cũng cho phép giảm nhiễu.

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