Интерполяция изображений из случайных пикселей


Я хотел бы задать вопрос относительно одноканальной интерполяции изображений. Один канал выбран просто для простоты, иначе я работаю с несколькими изображениями канала. Предположим, что существует одноканальное изображение с чистым черным фоном (интенсивность пикселей 0), на котором есть несколько пикселей с ненулевыми значениями интенсивности. Я хочу применить алгоритм интерполяции, чтобы заполнить всю черную область изображения интерполированными значениями, поступающими из соседних пикселей ненулевой интенсивности.

Какой алгоритм интерполяции вы бы рекомендовали для гладкой интерполяции, применимой к этой задаче?

В качестве входных данных мы, конечно, знаем расположение этих не черных пикселей и их интенсивность. Но расположение несколько случайное ( в одной строке может быть 10 пикселей, в другой строке только 8).

Введите описание изображения здесь

5 7

5 ответов:

Регулярное interp2 здесь не будет работать, так как ваши точки не расположены через равные интервалы (не сидя на сетке). Вы можете либо попробовать TriScatteredInterp, либо загрузить inpaint_nans с сервера обмена файлами.

Вот решение в вашем случае с TriScatteredInterp:

Введите описание изображения здесь

function solveStackOverflowProblem()
    im = imread('http://i.stack.imgur.com/lMaYR.png');
    im = im(:,:,2);
    [i,j] = find(im);
    y = j; x = i;
    indexes = sub2ind(size(im),i,j);
    interpolator = TriScatteredInterp(x,y,double(im(indexes)));

    [Y,X] = meshgrid( 1:size(im,2),1:size(im,1));
    reconstructedImage = interpolator(X,Y);

    figure;imshow(reconstructedImage/255)
end

Лучшее решение-использовать gridfit. Он предназначен для улучшения всех собственных функций Matlab, таких как TriScatteredInterp и griddata.

Приведено решение, основанное на использовании радиальных базисных функций ( в данном случае Гауссовой ) для построения интерполяций для произвольно расположенных точек с различной интенсивностью.

По существу, это отбрасывает Гаусса на каждую точку, взвешивает ее по интенсивности точки и суммирует результат. Резкость интерполяционной функции управляется через стандартное отклонение выбранной Гауссовой функции.

Пункты:

Mathematica graphics

Интерполяция:

Mathematica graphics

Просмотр в 3D: Mathematica graphics

С меньшим стандартным отклонением: Mathematica graphics

Код:

pts = Table[{{RandomReal[{0, 200}], RandomReal[{0, 200}]}, 
   RandomReal[]}, {20}]

dists = Function[points, 
  Plus @@ ((PDF[
          MultinormalDistribution[#, 200 IdentityMatrix[2]], {x, 
           y}] & /@ points[[All, 1]] ) points[[All, 2]])/Length@points]

DensityPlot[dists[pts], {x, 0, 200}, {y, 0, 200}, PlotPoints -> 100]

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

Чтобы найти цвет пикселя внутри треугольной области, веса, используемые для каждого пикселя, для точек A, B и C, соответственно, (b c-A)/a, (ac-B)/b и (a*b-C)/c. это гарантирует, что влияние каждой точки ухудшается до нуля по мере приближения точки к противоположному краю, так что переходы между треугольниками становятся плавными.

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

Схема маркировки частей треугольника

Любая интерполяция будет выглядеть очень плохо с этими несколькими ненулевыми точками, но вы можете попробовать свернуть изображение с помощью 2-D фильтра, такого как ядро Гаусса, и посмотреть, понравится ли вам это.