python - 在一个子像素位置将一个图像补丁插入另一个图像

标签 python opencv image-processing graphics computer-vision

我有一个图像补丁,我想在浮点位置插入另一个图像。实际上,我需要的是与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)并在p =(5,5)(左图)和p =(5.5,5.5)(中图)处插入了一个4x4色块(填充了值100)测试了此功能我们可以在下图中看到边界中没有插值。但是,如果将boderMode更改为 BORDER_CONSTANT ,则插值有效(右图),但是目标图像也用0填充了离群值。
enter image description here
可惜的是, BORDER_TRANSPARENT 不能使用插值。我建议这是对opencv项目的改进。

最佳答案

将补丁图像调整为所需的目标大小。然后基于1.0沿边缘设置alpha-左边缘的分数,右边缘的分数。然后混合。

它不是很完美,因为您没有正确地对所有像素重新采样,但这也会损坏分辨率。这可能是您最大的妥协。

关于python - 在一个子像素位置将一个图像补丁插入另一个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41898989/

相关文章:

image - Matlab:找到轮廓并拉直近乎矩形的图像

image-processing - 模糊图像的自适应阈值

python - 仅当数据可用时才从 USB 条码扫描仪读取

python - 未找到 Django 相关名称

python - 如何从裁剪的 numpy 矩形定义顶部和左侧点?

python - 使用 Python 的 PIL,如何在加载图像之前设置 DPI?

如果满足 NaN 阈值,Python 将删除 DF 中的所有特征实例

python - 使用sys.stdin.read()时,为什么我无法从键盘输入?

python - cv2、cv、mahotas 和 SimpleCV 之间的图像转换

opencv - 在图像集上使用FeatureDetector的第二个变体