如何使用cv2将图像的一部分覆盖/替换为另一部分?

时间:2018-07-31 14:45:13

标签: python opencv image-processing computer-vision image-stitching

我有一个覆盖大面积屋顶的图像!我正在使用细分对其进行分析。然而,挑战在于有时屋顶的单个镜头没有涉及的细节,因此很难对其进行分析。因此,我们将其分为多个部分并拍摄较小部分的图像并进行分析。 这是一个示例:

Entire roof shot

Part 1

Part 2

Part 3

因此,现在我要分析零件的故障并将其一次性更换。这是分析的部分之一的外观:

Post Analysis

到目前为止,我的想法是:如果我可以通过某种方式将未分析的零件映射到屋顶,我也可以使用相同的信息和方法将已分析的零件映射到单个镜头。

我已经能够进行特征检测并识别单张照片上的零件,但是我不确定如何转换它们以适合并替换单张照片上的确切零件。这是功能检测:

Feature detection for image/template matching

我一直在考虑尝试将较小的图像一个接一个地缝到较大的图像上,但是我担心这可能行不通

PS:我正在使用Linux,Python3和OpenCV 3.4.0

此外,原始的单张照片不会手动分为不同的部分。由于它具有热凸轮,因此不可能在单次拍摄时获得很高的分辨率,因此凸轮会以不同的镜头近拍。这些部分是单独的图像,不能从单张照片中裁剪出来。

编辑:我现在正在尝试一种替代方法,即检测零件图像中的故障,然后将这些故障裁剪为模板,然后尝试使用SIFT进行特征检测以将故障作为模板匹配到单个射击。但是,小缺陷正与自身以外的所有事物匹配:(大多数大缺陷都被检测为精细,中等缺陷也不是很好。我认为原因是图像的分辨率较低,单张照片无法复制

模板匹配的单发镜头上的特写镜头和特征数量也较少。

1 个答案:

答案 0 :(得分:0)

更新的答案

抱歉!我误解了这个问题。因此,使用特征映射方法,您可以在原始图片上获得与新图片中的一组点相对应的一组点。假设功能映射工作正常,则可以将对应关系描述为映射:

$$ P_ {new points} = T_ {原始至新} * P_ {原始} $$

其中T_ {original to new}是transformation matrix。如果您具有此转换矩阵,则可以轻松地对其进行转换,以查找“部分”图片与原始图片之间的关系。

挑战在于您当前拥有一个复杂的转换矩阵!您正在寻找的组件具有旋转组件,平移组件,缩放组件,并且很可能也会发生一些倾斜。我不确定在给定特征点集合的情况下找到此矩阵的正确方法。

如果您不介意做一些手工工作,建议您找到在两张图片上都对应的一组线,并使用OpenCV的perspective transformation为您找到此矩阵。

旧的,不相关的答案

我有一个亲吻答案:

当您从“整个屋顶拍摄图像”中手动选择“ 1-3部分”时,请跟踪其初始尺寸和位置。

如果您提前知道转换,则无需在以后计算转换。对于初学者,我建议将图像拆分为四分位数,并在具有这种简单几何图形的情况下覆盖检测结果。一旦成功,就可以解决原始图片中任意大小的框的问题。