[PYTHON] Suchen Sie den Bereich des Summensatzes überlappender Rechtecke

Overview

a1.png

So gibt es Zeiten, in denen Sie den Bereich des Summensatzteils zufällig überlappender Rechtecke suchen möchten.

Sie sehen, diese Art von Dingen ist heutzutage beliebt. (Bild von hier ausgeliehen: https://note.nkmk.me/python-opencv-face-detection-haar-cascade/) img

Ich kann dies erreichen, indem ich eine Hilfslinie zeichne und sie manuell berechne, aber es ist ziemlich schwierig, sie richtig zu berechnen https://mathcommunication.hatenablog.com/entry/2016/10/11/003213#%E5%B9%B3%E9%9D%A2%E5%9B%B3%E5%BD%A2%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%8F%AF%E6%B8%AC%E6%80%A7%E3%81%A8%E9%9D%A2%E7%A9%8D

NP schwierig? Für gewöhnliche Menschen ist das unmöglich

Politik

Zeichnen Sie direkt und zählen Sie die Pixel.

Es wird nicht so schön sein, wie wenn es mit einer Formel berechnet wird, und es wird einen Fehler in der Auflösung geben. Ich denke, es gibt nicht viele Fälle, in denen dies zu einem Problem wird.

Speziell,

Binarisieren

b1.png

Zähle schwarze (Füllfarbe) Pixel

In opencv gibt es eine sehr gute Funktion namens "countNonZero". Verwenden Sie diese. https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#countnonzero

Code

Lass uns gehen.

requirements.txt


cycler==0.10.0
kiwisolver==1.2.0
matplotlib==3.2.1
numpy==1.18.4
opencv-python==4.2.0.34
Pillow==7.1.2
pyparsing==2.4.7
python-dateutil==2.8.1
six==1.14.0

Da es zufällig ist, ändern sich Position und Größe des Rechtecks bei jeder Ausführung.

a.py


from PIL import Image, ImageDraw
import numpy as np
import cv2

import random
import matplotlib


rects = [
    (random.randrange(200),
        random.randrange(200),
        random.randrange(50, 120),
        random.randrange(50, 120)
    ) for x in range(20)
]

colors = random.sample(matplotlib.colors.cnames.keys(), len(rects))

#Zum Strichzeichnen
im1 = Image.new('RGB', (200, 200), (255, 255, 255))
d1 = ImageDraw.Draw(im1)
#Zur Bestätigung der binären Konvertierung
im2 = Image.new('RGB', (200, 200), (255, 255, 255))
d2 = ImageDraw.Draw(im2)

#Rechteckige Zeichnung
for r, c in zip(rects, colors):
    print(c, r)
    d1.rectangle(r, outline=c)
    d2.rectangle(r, fill=(0, 0, 0))

im1.save("a1.png ")
im2.save("a2.png ")

#Binäre Konvertierung
nim = np.array(im2, dtype=np.uint8)
gim = cv2.cvtColor(nim, cv2.COLOR_RGB2GRAY)
ret, bwim = cv2.threshold(gim, 0, 255, cv2.THRESH_OTSU)

#Bild nach binärer Konvertierung
cv2.imwrite("b1.png ", bwim)

whitePixels = cv2.countNonZero(bwim)
blackPixels = bwim.size - whitePixels

print("-"*50)
print(whitePixels, blackPixels, bwim.size)
print("filled area rate:", blackPixels / bwim.size)

Lauf

bash


$ python a.py
gainsboro (188, 158, 61, 63)
palegreen (174, 182, 118, 53)
chartreuse (75, 34, 82, 81)
olive (170, 10, 93, 111)
mistyrose (183, 65, 78, 52)
indianred (25, 55, 51, 109)
mediumaquamarine (102, 155, 59, 89)
navy (169, 127, 85, 96)
darkviolet (103, 152, 76, 51)
yellowgreen (84, 6, 73, 118)
deeppink (42, 61, 95, 90)
bisque (47, 101, 107, 105)
dimgrey (95, 179, 91, 70)
maroon (146, 182, 88, 62)
whitesmoke (189, 118, 83, 112)
lavender (71, 149, 104, 117)
burlywood (36, 82, 105, 82)
darkslategrey (122, 128, 103, 52)
mediumslateblue (163, 121, 84, 92)
silver (144, 126, 61, 58)
--------------------------------------------------
18580 21420 40000
fill area rate: 0.5355

Ende.

Referenz

https://note.nkmk.me/python-pillow-imagedraw/ https://techtech-sorae.com/pythonopencv%E3%81%A7%E4%BA%8C%E5%80%A4%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%89%E7%99%BD%E3%81%A8%E9%BB%92%E3%81%AE%E9%9D%A2%E7%A9%8D%E6%AF%94%E3%82%92%E7%AE%97%E5%87%BA/

Recommended Posts

Suchen Sie den Bereich des Summensatzes überlappender Rechtecke
So finden Sie den Bereich des Boronoi-Diagramms
Finden Sie die Definition des Wertes von errno
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode
Migemo-Version des Befehls: find,: mfind
Finden Sie den Koeffizienten des Polypolys mit dem kleinsten Quadrat
Die Hand von "Millijan" durch Kombinationsoptimierung finden
Finden Sie die Anzahl der Tage in einem Monat
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Finden Sie den Tag nach Datum / Uhrzeit heraus
Projecet Euler 12 Ermitteln Sie die Anzahl der Brüche ohne Division.
Berechnen Sie die Summe der eindeutigen Werte durch Pandas-Kreuztabellen
Kennen Sie den Speicherort der Python-Klassendefinitionsdatei.
Finden Sie die Version der Sprache heraus, die Sie ausführen
Finden Sie den Speicherort der mit pip installierten Pakete heraus
Der Beginn von cif2cell
Finden Sie das maximale Python
Die Bedeutung des Selbst
Union Find auf networkX
der Zen von Python
Die Geschichte von sys.path.append ()
Rache der Typen: Rache der Typen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
So finden Sie die optimale Anzahl von Clustern für k-means
Maya | Ermitteln Sie die Anzahl der Polygone im ausgewählten Objekt
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
[Python] Herons Formelfunktionalisierung und Berechnung der maximalen Fläche
Erben Sie die Standardbibliothek, um den Durchschnittswert der Warteschlange zu ermitteln
Python - Ermitteln Sie die Anzahl der Gruppen im regulären Ausdruck
Suchen Sie den Index des Maximalwerts (Minimalwerts) eines mehrdimensionalen Arrays
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
Ermitteln Sie den Durchmesser des Diagramms anhand der Suche nach Breitenpriorität (Python-Speicher).
Finden Sie den Durchschnitt / die Standardabweichung der Helligkeitswerte im Bild
Finden Sie die Eigenwerte einer reellen symmetrischen Matrix in Python