Интерполяция изображений из случайных пикселей
Я хотел бы задать вопрос относительно одноканальной интерполяции изображений. Один канал выбран просто для простоты, иначе я работаю с несколькими изображениями канала. Предположим, что существует одноканальное изображение с чистым черным фоном (интенсивность пикселей 0), на котором есть несколько пикселей с ненулевыми значениями интенсивности. Я хочу применить алгоритм интерполяции, чтобы заполнить всю черную область изображения интерполированными значениями, поступающими из соседних пикселей ненулевой интенсивности.
Какой алгоритм интерполяции вы бы рекомендовали для гладкой интерполяции, применимой к этой задаче?
В качестве входных данных мы, конечно, знаем расположение этих не черных пикселей и их интенсивность. Но расположение несколько случайное ( в одной строке может быть 10 пикселей, в другой строке только 8).
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.
Приведено решение, основанное на использовании радиальных базисных функций ( в данном случае Гауссовой ) для построения интерполяций для произвольно расположенных точек с различной интенсивностью.
По существу, это отбрасывает Гаусса на каждую точку, взвешивает ее по интенсивности точки и суммирует результат. Резкость интерполяционной функции управляется через стандартное отклонение выбранной Гауссовой функции.Пункты:
Интерполяция:
Просмотр в 3D:
С меньшим стандартным отклонением:
Код:
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. это гарантирует, что влияние каждой точки ухудшается до нуля по мере приближения точки к противоположному краю, так что переходы между треугольниками становятся плавными.
Имейте в виду, что вы можете использовать любой тип среднего, включая гармоническое и геометрическое, а не только арифметическое, чтобы сделать расчет (внешний вид изменится, но другие типы средних могут быть лучше в любом случае).