La dernière fois, la recherche sélective a été utilisée pour détecter des objets dans l'image du plat de steaks. Bien que la précision se soit améliorée, j'ai remarqué que sur environ 50 images, elles sont classées en environ 3 types: images en forme de poussière, la même image (position de recadrage légèrement différente) et les images d'objets nécessaires. .. Cette fois, j'essaierai de voir si je ne peux en sélectionner que les images d'objets nécessaires.
Une image avec un grand nombre de chevauchements n'est-elle pas nécessaire lors de l'extraction d'un objet d'une image? Cependant, en réalité, il est possible d'exclure la partie enfant rectangulaire de la relation parent-enfant.
Lors de la détection d'un objet à partir d'une image, il est extrait sous forme de rectangle, mais la partie où les rectangles sont mélangés est appelée chevauchement. La partie rouge de l'image ci-dessous.
Je l'ai écrit pour le moment.
group_image
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import selectivesearch
import os
def main():
# loading lena image
img = cv2.imread("{Image de repas de jeu de steak}")
# perform selective search
img_lbl, regions = selectivesearch.selective_search(
img,
scale=500,
sigma=0.9,
min_size=10
)
candidates = set()
for r in regions:
# excluding same rectangle (with different segments)
if r['rect'] in candidates:
continue
# excluding regions smaller than 2000 pixels
if r['size'] < 2000:
continue
# distorted rects
x, y, w, h = r['rect']
if w / h > 1.2 or h / w > 1.2:
continue
candidates.add(r['rect'])
# draw rectangles on the original image
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
ax.imshow(img)
overlaps = {}
#Comptez le nombre de chevauchements et attribuez-les au tableau.
for x, y, w, h in candidates:
group = '%s_%s_%s_%s' % (x, y, w, h)
for x2, y2, w2, h2 in candidates:
if x2 - w < x < x2 + w2 and y2 - h < y < y2 + h2:
if not group in overlaps:
overlaps[group] = 0
overlaps[group] = overlaps[group] + 1
print overlaps
#Sort les fichiers avec 30 chevauchements ou plus (30 est défini arbitrairement comme un seuil).
for key, overlap in enumerate(overlaps):
if overlap > 30:
for x, y, w, h in candidates:
group = x + y + w + h
if group in overlaps:
cv2.imwrite("{Chemin du répertoire}" + str(group) + '.jpg', img[y:y + h, x:x + w])
--Objet Détermine s'il chevauche l'image détectée.
if x2 - w < x < x2 + w2 and y2 - h < y < y2 + h2:
(Original) 50 feuilles → 36 feuilles
Environ 30% des images du plat de steaks ont été supprimées.
De plus, 5 types d'images d'objets de précédent sont restés.
Recommended Posts