удалить отверстия в изображении с помощью средних значений окружающих пикселей
может любой помочь мне в заполнении этих черных дыр с помощью значений, принимаемых от соседних ненулевых пикселей. благодаря
удалить отверстия в изображении с помощью средних значений окружающих пикселей
может любой помочь мне в заполнении этих черных дыр с помощью значений, принимаемых от соседних ненулевых пикселей. благодаря
Существует файл на обмен файлами Matlab, - inpaint_nans что делает именно то, что вы хотите. Автор объясняет, почему и в каких случаях это лучше, чем триангуляция Делоне.
спасибо, что это дает удовлетворительный результат –
Чтобы заполнить одну черную область, выполните следующие действия:
1) Определение суб-область, содержащую черную область, тем меньше, тем лучше. Лучший случай - это только граничные точки черной дыры.
2) Создание триангуляционный из не-черных точек внутри подобласти по:
tri = DelaunayTri(x,y); %# x, y (column vectors) are coordinates of the non-black points.
3) Определить черные точки, в которых Делон треугольник по:
[t, bc] = pointLocation(tri, [x_b, y_b]); %# x_b, y_b (column vectors) are coordinates of the black points
tri = tri(t,:);
4) Интерполяция:
v_b = sum(v(tri).*bc,2); %# v contains the pixel values at the non-black points, and v_b are the interpolated values at the black points.
Кажется, это сработает, дайте мне попробовать.спасибо за ваши усилия –
Один хороший способ сделать это - решить linear heat equation. То, что вы делаете, - это зафиксировать «температуру» (интенсивность) пикселей в хорошей области и позволить тепловому потоку попасть в плохие пиксели. Пропускная, но несколько медленная, чтобы сделать это, неоднократно усредняет изображение, а затем возвращает хорошие пиксели в исходное значение с newImage(~badPixels) = myData(~badPixels);
.
я выполнить следующие шаги:
Вы могли бы повторить усреднение, пока изображение не перестанет изменяться, и вы могли бы использовать меньшее осреднения ядро для более высокой точности --- но это дает хорошие результаты:
код выглядит следующим образом:
numIterations = 30;
avgPrecisionSize = 16; % smaller is better, but takes longer
% Read in the image grayscale:
originalImage = double(rgb2gray(imread('c:\temp\testimage.jpg')));
% get the bad pixels where = 0 and dilate to make sure they get everything:
badPixels = (originalImage == 0);
badPixels = imdilate(badPixels, ones(12));
%# Create a big gaussian and an averaging kernel to use:
G = fspecial('gaussian',[1 1]*100,50);
H = fspecial('average', [1,1]*avgPrecisionSize);
%# User a big filter to get started:
newImage = imfilter(originalImage,G,'same');
newImage(~badPixels) = originalImage(~badPixels);
% Now average to
for count = 1:numIterations
newImage = imfilter(newImage, H, 'same');
newImage(~badPixels) = originalImage(~badPixels);
end
%% Plot the results
figure(123);
clf;
% Display the mask:
subplot(1,2,1);
imagesc(badPixels);
axis image
title('Region Of the Bad Pixels');
% Display the result:
subplot(1,2,2);
imagesc(newImage);
axis image
set(gca,'clim', [0 255])
title('Infilled Image');
colormap gray
Но вы можете получить аналогичное решение с использованием roifill
из обработки изображений инструментов, как так:
newImage2 = roifill(originalImage, badPixels);
figure(44);
clf;
imagesc(newImage2);
colormap gray
Извещение Я использую те же самые badPixels, определенные ранее.
http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem – Royi
Duplicate on DSP: http://dsp.stackexchange.com/q/2803/590 – Chris
Решение этого: http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem сделает это .. – Royi