У меня есть патч для изображения, который я хочу вставить в другое изображение в месте с плавающей точкой. На самом деле, мне нужно что-то вроде противоположного тому, что делает opencv функция getRectSubPix.Вставьте патч изображения в другое изображение в подпикселе
Я предполагаю, что смогу реализовать его, выполнив подпиксельную деформацию патча в другой патч и вставив этот другой патч в целевое изображение в целочисленном месте. Тем не менее, у меня нет четкого представления о том, что делать с пустой частью пикселей в извращенном патче, или как я смогу совместить границу нового патча с целевым изображением.
Я скорее использую библиотечную функцию, чем сама реализация этой операции. Кто-нибудь знает, есть ли какая-либо функция библиотеки, которая может выполнять этот тип операции, в opencv или любой другой библиотеке обработки изображений?
ОБНОВЛЕНИЕ:
я обнаружил, что OpenCV warpPerspective может быть использован с borderMode = BORDER_TRANSPARENT, что означает, что пиксели в целевом изображении, соответствующие «выбросы» в исходном изображении не являются измененный функцией. Поэтому я думал, что смогу реализовать эту подпиксельную вставку с помощью всего лишь warpPerspective и адекватной матрицы преобразования. Поэтому я написал эту функцию в Python для выполнения операции:
def insert_patch_subpixel(im, patch, p):
"""
im: numpy array with source image.
patch: numpy array with patch to be inserted into the source image
p: tuple with the center of the position (can be float) where the patch is to be inserted.
"""
ths = patch.shape[0]/2
xpmin = p[0] - ths
ypmin = p[1] - ths
Ho = np.array([[1, 0, xpmin],
[0, 1, ypmin],
[0, 0, 1]], dtype=float)
h,w = im.shape
im2 = cv2.warpPerspective(patch, Ho, (w,h), dst=im,
flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_TRANSPARENT)
return im2
К сожалению, интерполяция не похожа на работу для останца пикселей, если BORDER_TRANSPARENT используются. Я тестировал эту функцию с небольшим 10x10-изображением (заполненным значением 30) и вставляя патч 4x4 (заполненный значением 100) при p = (5,5) (левый рисунок) и p = (5.5,5.5) (средний рисунок) и на нижеследующих рисунках видно, что на границе нет интерполяции. Однако, если я изменю boderMode на , BORDER_CONSTANT работает с интерполяцией (рисунок справа), но также заполняет целевое изображение 0s для значений outlier.
Это позор, что интерполяция не работает с BORDER_TRANSPARENT. Я предлагаю это как усовершенствование проекта opencv.
Искривление суб-изображение в другой может быть сделано с помощью 'cv2.findHomography()' –
Это может быть излишним для вашей проблемы, но вы можете деформировать патч в Фурье области пространства, то обратное преобразование и объединить его в ваш целевой образ. Если выполнено правильно, что операция дает точность субпикселя –
@ Matt-Mac-Muffin вы могли бы немного подробнее остановиться на этом подходе? – martinako