如何解决如何检测连续图像
我试图检测两个图像何时对应于与另一个图像匹配但没有重叠的块。
也就是说,假设我们有 Lenna 图像:
我不认识的人将它垂直分成两部分,我必须知道两部分是否相连(假设它们是独立的图像,或者一个是另一个的一部分)。
积极的部分是我知道片段的顺序,消极的部分是可能还有其他图像,我必须知道其中哪些适合或不适合加入。
我的第一个想法是检查 A 的最后一行和第一行 B 之间的 MAE 是否低。
def mae(a,b):
min_mae = 256
for i in range(-5,5,1):
a_s = np.roll(a,i,axis=1)
value_mae = np.mean(abs(a_s - b))
min_mae = min(min_mae,value_mae)
return min_mae
if mae(im_a[im_a.shape[0] - 1:im_a.shape[0],...],im_b[0:1,...]) < threshold:
# join images a and b
问题在于它不是一个非常可靠的指标。
我使用水平导数做了同样的事情,并应用了各种平滑滤波器,但我发现自己处于同样的情况。
有没有办法解决这个问题?
解决方法
你的方法看起来不错。即使在目视检查中它看起来也很合理:
顶部(底部行展开)
底部(顶行展开)
图像差异:
如果您还检查相邻的列可能会更清楚,但这看起来已经足够相似了。
代码
import cv2
import numpy as np
# load images
top = cv2.imread("top.png");
bottom = cv2.imread("bottom.png");
# gray
tgray = cv2.cvtColor(top,cv2.COLOR_BGR2GRAY);
bgray = cv2.cvtColor(bottom,cv2.COLOR_BGR2GRAY);
# expand rows
texp = tgray;
bexp = bgray;
trow = np.zeros_like(texp);
brow = np.zeros_like(bexp);
trow[:] = texp[-1,:];
brow[:] = bexp[0,:];
trow = trow[:100,:];
brow = brow[:100,:];
# check absolute difference
ldiff = trow - brow;
rdiff = brow - trow;
diff = np.minimum(ldiff,rdiff);
# show
cv2.imshow("top",trow);
cv2.imshow("bottom",brow);
cv2.imshow("diff",diff);
cv2.waitKey(0);
# save
cv2.imwrite("top_out.png",trow);
cv2.imwrite("bottom_out.png",brow);
cv2.imwrite("diff_out.png",diff);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。