我有两对相同的2D物体的图像,它们的差别很小,一对图像中的两个图像有两个参考点(一个星星[x_s,y_s]和一个箭头[x_a,y_a]),如下所示:
我已经编写了一个Python脚本来将一个图像与参考点/坐标对中的第二个图像对齐。请浏览下面的代码以获得清晰的理解:
import numpy as np
import cv2
import pandas as pd
# Function to align image2 with respect to image1:
def alignFromReferenceImage(image1, imgname1, image2, imgname2):
# Using Panda dataframe to read the coordinate values ((x_s,y_s) and (x_a,y_a)) from a csv file
#
# The .csv file looks like this:-
#
# id;x_s;y_s;x_a;y_a
# img11;113;433;45;56
# img12;54;245;55;77
# img21;33;76;16;88
# img22;62;88;111;312
# ... ;..;..;...;
df = pd.read_csv("./image_metadata.csv", delimiter= ';')
# Eliminate .jpg from the image name and fetch the row
filter_data=df[df.isin([imgname1.split('.')[0]]).any(1)]
x1_s=filter_data['x_s'].values[0]
y1_s=filter_data['y_s'].values[0]
x1_a=filter_data['x_a'].values[0]
y1_a=filter_data['y_a'].values[0]
filter_data2=df[df.isin([imgname2.split('.')[0]]).any(1)]
x2_s=filter_data2['x_s'].values[0]
y2_s=filter_data2['y_s'].values[0]
x2_a=filter_data2['x_a'].values[0]
y2_a=filter_data2['y_a'].values[0]
tx=x2_s-x1_s
ty=y2_s-y1_s
rows,cols = image1.shape
M = np.float32([[1,0,-tx],[0,1,-ty]])
image_after_translation = cv2.warpAffine(image2,M,(cols,rows))
d1 = math.sqrt((x1_a - x1_s)**2 + (y1_a - y1_s)**2)
d2 = math.sqrt((x2_a - x2_s)**2 + (y2_a - y2_s)**2)
dx1 = x1_a - x1_s
dy1 = -(y1_a - y1_s)
alpha1 = math.degrees(math.atan2(dy1, dx1))
alpha1=(360+alpha1) if (alpha1<0) else alpha1
dx2 = x2_a - x2_s
dy2 = -(y2_a - y2_s)
alpha2 = math.degrees(math.atan2(dy2, dx2))
alpha2=(360+alpha2) if (alpha2<0) else alpha2
ang=alpha1-alpha2
scale = d1 / d2
centre = (filter_data['x_s'].values[0], filter_data['y_s'].values[0])
M = cv2.getRotationMatrix2D((centre),ang,scale)
aligned_image = cv2.warpAffine(image_after_translation, M, (cols,rows))
return aligned_image
对齐后,图像如下所示:
**重要提示:**现在,在将第一张图像与第二张图像对齐后,我想裁剪对齐的图像,使图像在裁剪后不再有黑色背景。下图将清楚地说明我想做什么:
我研究了一下,发现了一些有用的链接:
2条答案
按热度按时间hkmswyz61#
如果你想要“任何帮助”,并愿意使用Imagemagick 7,那么有一个简单的解决方案使用其积极的修剪。
输入:
wj8zmpe12#
下面是一个Python/OpenCV的解决方案。它首先对图像进行阈值处理,使背景为黑色,其余部分为白色。它测试阈值图像的每条边,计算平均值,并寻找平均值最低的边。如果平均值==255,它就停在那条边上。如果不是,它就修剪掉那条边并重复。一旦所有边的平均值都是255。它完全停止并使用每一侧上的增量来计算原始输入的裁剪。
输入:
阈值图像:
裁剪的输入: