Ihre Aufgabe ist es, ein Programm zu schreiben, das ein Eingabebild aufnimmt und es durch Kantenerkennung ausführt, um ein Ausgabebild zu werden.
Die Kantenerkennung funktioniert wie folgt (falls unklar, siehe Sobel-Kantenerkennung ):
- Der Wert für ein Pixel entspricht der Gesamthelligkeit eines Pixels. Wenn es sich also um ein farbiges Pixel handelt, müssen Sie es zuerst in Graustufen konvertieren B).
- Die Formeln für G x und G y für Pixel p (i, j) lauten:
- G x = -1 * p (i-1, j-1) - 2 * p (i-1, j) - 1 * p (i-1, j + 1) + 1 * p (i + 1, j -1) + 2 * p (i + 1, j) + 1 * p (i + 1, j + 1)
- G y = -1 * p (i-1, j-1) - 2 * p (i, j-1) - 1 * p (i + 1, j-1) + 1 * p (i-1, j +1) + 2 * p (i, j + 1) + 1 * p (i + 1, j + 1)
- Der Wert für die Größe der Kante an diesem Pixel ist dann: √ (G x 2 + G y 2 )
Das Ausgabebild hat für jedes Pixel die Größe der Kante √ (G x 2 + G y 2 ) als Graustufen.
Boni:
- Führen Sie eine Gaußsche Unschärfe durch, um das Bild vor dem Aktivieren der Kantenerkennung zu glätten und kleinere Kanten zu vermeiden. Dies ergibt einen Bonus von -30% auf das Endergebnis.
- Berücksichtigen Sie den Winkel der Kante. Sie geben dem Ausgabepixel eine gewisse Farbe, indem Sie denselben Graustufenwert nehmen und Farbe aus einem Farbrad unter Verwendung des Winkels hinzufügen, der aus der Formel arctan (G y / G x ) erhalten wird. Dies gibt einen weiteren Bonus von -30% auf das Endergebnis.
Regeln:
- Sie können den Wert für die Randpixel weglassen und auf Schwarz setzen, oder Sie können 0 für alle Pixel außerhalb des Bildes verwenden.
- Ihr Ausgabebild muss in einem Bildformat vorliegen, das auf den meisten Computern geöffnet werden kann.
- Die Ausgabe muss auf die Festplatte geschrieben oder in eine Datei umgeleitet werden.
- Die Eingabe erfolgt als Befehlszeilenargument in Form eines relativen Pfads zum Bild oder über die Befehlszeile.
- Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!
Antworten:
J,
166 164 161 154 150 144143 Bytes.Nicht zu viel Golf gespielt; Ich habe meine längere Implementierung größtenteils reduziert (siehe unten), daher gibt es wahrscheinlich viel Raum für Verbesserungen. Verwendet die BMP-Bibliothek. Speichert das Ergebnis in einer Datei
o
. Ich habe Kantenpixel nur mit vollen 3x3-Zellen verarbeitet, sodass das endgültige Bild eine um 2 Pixel geringere Breite und Höhe aufweist.Verwendung:
Erweitert:
Probenein- und ausgabe:
quelle
;._3
Subarray-Operator. Ich habe festgestellt, dass Sie ein Verbp
mit Rang 2 definiert haben , um die Subarrays zu bearbeiten, nachdem Sie sie erstellt haben. Sie können stattdessen jedes Subarray bearbeiten, wenn Sie schneiden. Mein Versuch, es basierend auf Ihrer Arbeit umzusetzen, ist256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. Das sollte es auf insgesamt 126 Bytes reduzieren.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
Annahme, dass nur der Dateiname auf stdin eingegeben wird. Sie können diesecho -n
so ausführen, dass in stdin kein zusätzlicher Zeilenumbruch enthalten ist. Auf meinem Computer wird das Skript automatisch beendet, wenn eine weitergeleitete Eingabe für ein Skript verwendet wird.exit''
Dies bedeutet, dass ich das Skript nicht einschließen muss und zusätzliche 6 Bytes speichern kann, aber ich bin nicht sicher, ob dies für alle zutrifft.Python 161 * 0,7 = 112,7 Bytes
Mit dem Gaußschen Unschärfebonus.
Da Sie eingebaute Methoden nicht explizit verboten haben, ist hier OpenCV:
Ohne Bonus 136 Bytes
quelle
MATLAB, 212 * 0,4 = 84,8 Bytes
Verwenden der Filter-Toolbox und des HSV-Farbraums
oder ungolfed
quelle
Love2D Lua, 466 Bytes
Übernimmt die Befehlszeileneingabe und gibt sie in eine Datei mit dem Namen "o" in Ihrem Love2D-Appsdata-Ordner aus. Mit Love2D können Sie keine Dateien an einem anderen Ort speichern.
Genau so gut wie ich es bekommen könnte, könnte es wahrscheinlich noch weiter gehen.
Erklärt
Prüfung
Und...
Obwohl es meine Punktzahl nicht verbessert (macht es noch schlimmer), ist hier die Version mit dem implementierten Farbrad.
900 - 270 = 630 Bytes
quelle