2012-07-05 2 views
9

Gray Scale Image with Holesудалить отверстия в изображении с помощью средних значений окружающих пикселей

может любой помочь мне в заполнении этих черных дыр с помощью значений, принимаемых от соседних ненулевых пикселей. благодаря

+0

Duplicate on DSP: http://dsp.stackexchange.com/q/2803/590 – Chris

+0

Решение этого: http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem сделает это .. – Royi

ответ

5

Существует файл на обмен файлами Matlab, - inpaint_nans что делает именно то, что вы хотите. Автор объясняет, почему и в каких случаях это лучше, чем триангуляция Делоне.

+0

спасибо, что это дает удовлетворительный результат –

2

Чтобы заполнить одну черную область, выполните следующие действия:

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. 
+0

Кажется, это сработает, дайте мне попробовать.спасибо за ваши усилия –

8

Один хороший способ сделать это - решить linear heat equation. То, что вы делаете, - это зафиксировать «температуру» (интенсивность) пикселей в хорошей области и позволить тепловому потоку попасть в плохие пиксели. Пропускная, но несколько медленная, чтобы сделать это, неоднократно усредняет изображение, а затем возвращает хорошие пиксели в исходное значение с newImage(~badPixels) = myData(~badPixels);.

я выполнить следующие шаги:

  1. Найти плохие пиксели, где образ равен нулю, то расширяются, чтобы убедиться, что мы получаем все
  2. Нанесите большое пятно, чтобы нас начали быстрее
  3. Average изображение, а затем установить хорошие пиксели обратно в исходном
  4. Повторите шаг 3
  5. Дисплей

Вы могли бы повторить усреднение, пока изображение не перестанет изменяться, и вы могли бы использовать меньшее осреднения ядро ​​для более высокой точности --- но это дает хорошие результаты:

enter image description here

код выглядит следующим образом:

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, определенные ранее.

+0

http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem – Royi