scikit-imageやopencvなどの画像解析moduleを使うと様々なフィルタが用意されています。
縦線ををノイズと認識させないためには縦方向に長いfootprintを使ってフィルタをかけるといいです。
ノイズ消去はSmoothing filterが良いと思いますが、median filter とgaussian filterの例をあげています。ノイズの検知としてgradient とentropyの例をあげています。
#%%
import numpy as np
import matplotlib.pyplot as plt
from skimage import filters, morphology
#%% サンプル画像作成
# sample_img = np.random.standard_normal(size=(100, 100))
sample_img = np.zeros((100, 100))
# add linear bright line
for i in range(5):
column_idx = np.floor(np.random.rand() * 100).astype(int)
sample_img[:, column_idx] += 4
# add noise blob
for i in range(10):
noise_image = np.zeros((100, 100))
column_idx = np.floor(np.random.rand() * 100).astype(int)
row_idx = np.floor(np.random.rand() * 100).astype(int)
noise_image[row_idx, column_idx] = np.random.rand() * 100
noise_image = filters.gaussian(noise_image, sigma=1 + np.random.rand() * 3)
sample_img += noise_image
sample_img= sample_img/np.max(np.abs(sample_img))
plt.imshow(sample_img)
# %%
footprint = morphology.rectangle(30, 1) #ここで縦方向に何ピクセルを使うかを指定
# median filter(中央値に置き換え)
median_img = filters.median(sample_img, footprint=footprint)
# gaussian filter (ガウシアンフィルタ、sigmaで縦長を指定)
gaussian_img = filters.gaussian(sample_img, sigma=(20,0.1))
# 提示されている方法 (ローカルのmax-min)
min_img = filters.rank.minimum(sample_img, footprint=footprint)
max_img = filters.rank.maximum(sample_img, footprint=footprint)
contrast_img = max_img - min_img
# 同じ方法
gradient_img = filters.rank.gradient(sample_img, footprint=footprint)
# エントロピー
entropy_img = filters.rank.entropy(sample_img, footprint=footprint)
plt.imshow(median_img)
plt.show()
plt.imshow(gaussian_img)
plt.show()
plt.imshow(contrast_img)
plt.show()
plt.imshow(gradient_img)
plt.show()
plt.imshow(entropy_img)
plt.show()
0Like