【发布时间】:2020-06-21 18:48:04
【问题描述】:
我有一堆不同的鸟类图像,但其中一些包含羽毛、略微可见的鸟类等。我需要找到鸟类清晰可见的图像并删除带有羽毛、远距离鸟类等的图像。
我已经尝试过 ORB,简单的模板匹配,Canny 边缘检测。而且我不能使用神经网络。
现在我尝试使用这样的算法:
二值化模板图像以获得形状
使用滑动窗口在另一个二值化图像上滑动窗口,并在每个窗口中使用模板计算 matchShape
- 找到最佳匹配
如你所见,这种方法给了我奇怪的结果
二进制模板
.
其他二值图像上的形状,例如:
我在这张图片的不同部分计算了matchShapes,得到了最好的结果~0.05我在这部分得到了:
这显然与原来的形状不相似。
滑动窗口代码:
import cv2
OFFSET = 5
SCALE_RATIO = [0.5, 1]
def get_scaled_list(img_path, template):
matcher_list = []
img = cv2.imread(img_path)
#JUST BINARIZATION AND RESIZING
img = preprocess(resize_image(img))
height, width = img.shape
# building size of scale window
for scaler in SCALE_RATIO:
x_point = 0
y_point = 0
x1_point = int(width * scaler)
y1_point = x1_point
if x1_point > height:
y1_point = height
while y1_point <= height:
while x1_point <= width:
img1 = img[y_point:y1_point, x_point:x1_point]
#Comparing template and part of image
diff = cv2.matchShapes(template, img1, cv2.CONTOURS_MATCH_I1, 0)
data_tuple = (img_path, x_point, y_point, int(width * scaler), diff)
matcher_list.append(data_tuple)
x_point += OFFSET
x1_point += OFFSET
x_point = 0
x1_point = int(width * scaler)
y_point += OFFSET
y1_point += OFFSET
return matcher_list
我怎样才能执行正确的形状匹配,为什么这里执行最好的结果?
【问题讨论】:
-
欢迎。你不能等待
matchShapes找到第二张图片中的鸟。 matchShapes 仅比较 2 个轮廓,但在第二张图像中,鸟不像第一张图像那样是一个轮廓。它给出错误轮廓作为匹配的原因是它试图找到最合适的匹配。 -
谢谢,简单的模板匹配对我来说效果很好。过度思考我的任务:D
标签: python opencv image-processing