Я предполагаю, что у вас есть линии шириной в 1 пиксель на вашем изображении, которые ярче или темнее, чем их окружение, и вы хотите найти их и удалить с изображения и заменить удаленные пиксели средним значением локальной окрестности.
Я разработал для этого алгоритм, и он работает на моем примере данных (поскольку вы не дали никаких данных). Он состоит из двух частей:
Идентификация строк
Я не мог придумать простой, но эффективный фильтр для обнаружения линий (которые связаны, поэтому, вероятно, нужно смотреть на корреляции). Поэтому я использовал простой фильтр обнаружения одного пикселя:
-1 -1 -1
-1 8 -1
-1 -1 -1
а затем некоторое подходящее пороговое значение.
Экстраполяция данных из-за пределов маски в маску
Очень элегантное решение (используя только свертки) состоит в том, чтобы взять данные за пределами маски и свернуть их с помощью гаусса, затем взять отрицательную маску и свернуть ее с тем же самым гауссианом, а затем разделить оба попиксельно. Результатом внутри маски является желаемое размытие.
Что это математически: взвешенное усреднение данных.
Вот мои фантомные данные:
А это идентификация линий
И окончательный результат показывает, что искажение было подавлено в десять раз:
И, наконец, мой код (в Matlab):
%% create phantom data with lines (1pixel wide bands)
[x, y] = ndgrid(1:100, 1:100);
original = 3 * x - 2 * y + 100 * sin(x / 2) + 120 * cos(y / 3); % funny shapes
bw = original > mean(original(:)); % black and white
distortion = bwmorph(bw,'remove'); % some lines
data = original + max(original(:)) * distortion; % phantom
% show
figure();
subplot(1,3,1); imagesc(original); axis image; colormap(hot); title('original');
subplot(1,3,2); imagesc(distortion); axis image; title('distortion');
subplot(1,3,3); imagesc(data); axis image; title('image');
%% line detection
% filter by single pixel filter
pixel_filtered = filter2([-1,-1,-1;-1,8,-1;-1,-1,-1], data);
% create mask by simple thresholding
mask = pixel_filtered > 0.2 * max(pixel_filtered(:));
% show
figure();
subplot(1,2,1); imagesc(pixel_filtered); axis image; colormap(hot); title('filtered');
subplot(1,2,2); imagesc(mask); axis image; title('mask');
%% line removal and interpolation
% smoothing kernel: gaussian
smooth_kernel = fspecial('gaussian', [3, 3], 1);
smooth_kernel = smooth_kernel ./ sum(smooth_kernel(:)); % normalize to one
% smooth image outside mask and divide by smoothed negative mask
smoothed = filter2(smooth_kernel, data .* ~mask) ./ filter2(smooth_kernel, ~mask);
% withing mask set data to smoothed
reconstruction = data .* ~mask + smoothed .* mask;
% show
figure();
subplot(1,3,1); imagesc(reconstruction); axis image; colormap(hot); title('reconstruction');
subplot(1,3,2); imagesc(original); axis image; title('original');
subplot(1,3,3); imagesc(reconstruction - original); axis image; title('difference');
person
Trilarion
schedule
13.02.2015