Letztes Mal wurde die selektive Suche verwendet, um Objekte im Bild des Steak-Set-Essens zu erkennen. Obwohl sich die Genauigkeit verbessert hat, habe ich festgestellt, dass von ungefähr 50 Bildern ungefähr 3 Typen klassifiziert werden: staubartige Bilder, dasselbe Bild (leicht unterschiedliche Beschneidungsposition) und erforderliche Objektbilder. .. Dieses Mal werde ich versuchen zu sehen, ob ich nur die erforderlichen Objektbilder aus ihnen auswählen kann.
Ist beim Extrahieren eines Objekts aus einem Bild nicht ein Bild mit einer großen Anzahl von Überlappungen erforderlich? In der Realität ist es jedoch möglich, den rechteckigen untergeordneten Teil der Eltern-Kind-Beziehung auszuschließen.
Wenn Sie ein Objekt aus einem Bild erkennen, wird es als Rechteck extrahiert. Der Teil, in dem die Rechtecke gemischt werden, wird als Überlappung bezeichnet. Der rote Teil des Bildes unten.
Ich habe es vorerst geschrieben.
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("{Steak Set Mahlzeit Bild}")
# 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 = {}
#Zählen Sie die Anzahl der Überlappungen und weisen Sie sie dem Array zu.
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
#Gibt Dateien mit 30 oder mehr Überlappungen aus (30 wird willkürlich als Schwellenwert festgelegt).
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("{Verzeichnispfad}" + str(group) + '.jpg', img[y:y + h, x:x + w])
--Object Legt fest, ob es sich mit dem erkannten Bild überschneidet.
if x2 - w < x < x2 + w2 and y2 - h < y < y2 + h2:
(Original) 50 Blatt → 36 Blatt
Etwa 30% der Bilder der Steak-Mahlzeit wurden entfernt.
Darüber hinaus blieben 5 Arten von Objektbildern von vorherigen übrig.
Recommended Posts