图像对齐,降低不透明度

时间:2017-06-05 01:00:16

标签: python opencv image-processing opacity

在下面给出的程序中,我使用单应性对齐两个图像并降低im_out图像中im_dst图像的不透明度(比如opacity = 0.5),这样我就可以在im_out图像中看到im_src和im_dst图像。但我得到的只是im_out图像中的黑色im_dst图像!

{
    $currency_position = self::param('site', 'curr_position')['value'];
    $currency = self::param('site', 'currency')['value'];
    switch ($currency_position) {
        case CURRENCY_BEFORE:
            return implode(' ', [$currency, number_format($amount, 2)]);
            break;
        case CURRENCY_AFTER:
            return implode(' ', [number_format($amount, 2), $currency]);
            break;
 }

我是openCV的新手,所以我可能会遗漏一些简单的东西。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

嘿,我之前seen those points

您的代码正在做的是减少两个图片im_dstim_src的值,但是您只需将im_src的褪色图像移动到新位置并显示那。相反,您应该将淡化和扭曲的图像添加到目标图像并输出。以下是对代码结束的工作修改:

alpha = 0.5
im_dst = img1 * alpha
im_src = img2 * (1-alpha)
im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))
im_blended = im_dst + im_out
cv2.imshow("Blended Warped Image", im_blended)
cv2.waitKey(0)

但是,您只将img1而不是img2除以255,所以您希望先将它们分开。

但是,没有理由手动执行此操作,因为您必须担心转换图像类型和缩放以及所有这些。相反,更简单的方法是使用内置的OpenCV函数addWeighted()将两个图像与alpha混合一起添加。所以你的整个代码就是这么短:

import cv2
import numpy as np

im_src = cv2.imread('src.jpg')
pts_src = np.array([[141, 131], [480, 159], [493, 630],[64, 601]])
im_dst = cv2.imread('dst.jpg')
pts_dst = np.array([[318, 256],[534, 372],[316, 670],[73, 473]])

h, status = cv2.findHomography(pts_src, pts_dst)
im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))

alpha = 0.5
beta = (1.0 - alpha)
dst_warp_blended = cv2.addWeighted(im_dst, alpha, im_out, beta, 0.0)

cv2.imshow('Blended destination and warped image', dst_warp_blended)
cv2.waitKey(0)

函数addWeighted()将第一张图片im_dst乘以alpha,将第二张图片im_out乘以beta。最后一个参数是正向移位,如果需要,可以添加到结果中。最后,结果已经饱和,因此高于您的数据类型允许的值的值将被最大限度地截断。这样,您的结果与输入的类型相同 - 您不必转换为浮动。

关于您的代码的最后一点。许多教程,包括上面链接的教程,使用findHomography()从四个匹配点获得单应性。在这种情况下使用getPerspectiveTransform()更合适。函数findHomography()基于许多匹配点找到最佳单应性,使用异常值拒绝方案和随机抽样来加速遍历所有可能的四个匹配点集。当然,它适用于四组点,但是当你有四个匹配点时使用getPerspectiveTransform()更有意义,而当你有四个匹配点时使用findHomography()更有意义。尽管如此,令人烦恼的是,无论出于何种原因,您传递到getPerspectiveTransform()的点必须是np.float32类型。所以这将是我对您的代码的最终建议:

import cv2
import numpy as np

# Read source image.
im_src = cv2.imread('src.jpg')
# Four corners of the book in source image
pts_src = np.array([[141, 131], [480, 159], [493, 630],[64, 601]], dtype=np.float32)

# Read destination image.
im_dst = cv2.imread('dst.jpg')
# Four corners of the book in destination image.
pts_dst = np.array([[318, 256],[534, 372],[316, 670],[73, 473]], dtype=np.float32)

# Calculate Homography
h = cv2.getPerspectiveTransform(pts_src, pts_dst)

# Warp source image to destination based on homography
warp_src = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))

# Blend the warped image and the destination image
alpha = 0.5
beta = (1.0 - alpha)
dst_warp_blended = cv2.addWeighted(im_dst, alpha, warp_src, beta, 0.0)

# Show the output
cv2.imshow('Blended destination and warped image', dst_warp_blended)
cv2.waitKey(0)

此(以及上述所有其他解决方案)将生成以下图像: Warped im_src blended with im_dst