Motive Wie Sie wissen, veröffentlicht Irasutoya weiterhin trendige kostenlose Materialien. Plötzlich fragte ich mich, was passieren würde, wenn diese Bilder zu Punktbildern gemacht würden, also habe ich sie erstellt.
Method Wie ich in Wizard's Forest geschrieben habe, wird gesagt, dass die Anzeigefarbe von Famicom etwa 52 beträgt. (Nicht deterministisch.) Um es wie ein Famicom aussehen zu lassen, werde ich hier versuchen, die Farbanordnung von R, G und B in 4 Teile zu reduzieren und sie anzuzeigen.
Jeder Bereich ist "0 bis 255", aber wenn Sie ihn einfach teilen, erhalten Sie "[0, 85, 170, 255]".
Alle Farbkombinationen haben ein 64er-Muster. Wenn Sie es jedoch tatsächlich als Bild ausgeben, wird es wie folgt angezeigt.
import cv2
import numpy as np
if __name__ == "__main__":
height = 576
width = 1024
range_color = [0, 85, 170, 255]
mono = np.zeros((height, width, 3), np.uint8)
mono[:] = tuple((0,0,0))
for r in range(4):
for g in range(4):
for b in range(4):
mono[144*b:144*(b+1), 64*(r+g*4):64*(r+(g*4+1))] = tuple((85*b,85*g,85*r))
cv2.imwrite("out.png ", mono)
Nebenbei dachte ich, dass es auf den ersten Blick keine graue Farbe gibt, aber sie wird in 2 Zeilen und 6 Spalten "(85,85,85)" und 3 Zeilen und 11 Spalten "(170,170,170)" angezeigt.
Also, wie man nach der Anzahl der ursprünglichen Farbdaten beurteilt, aber als Beispiel, wenn Sie den Wert von "110" verteilen möchten, beurteilen Sie, was näher an "85 ~ 170" liegt. Da hier "85" am nächsten ist, konvertieren Sie es in "110-> 85" und wenden Sie diesen Algorithmus auf alle Pixel an.
Develop
import cv2
import numpy as np
import sys
def resize(src):
h,w = mat.shape[:-1]
height = (h // 16) * 16
width = (w // 16)* 16
return cv2.resize(mat,(width,height))
def convertReduceColor(src):
thresholds = [42,127,212]
range_color = [0, 85, 170, 255]
count = 0
for th in thresholds:
if src <= th:
break
count += 1
return range_color[count]
if __name__ == "__main__":
__CELL_SIZE__ = 4
path = sys.argv[1]
mat = cv2.imread(path,cv2.IMREAD_UNCHANGED)
mat = resize(mat)
height, width = mat.shape[:-1]
for w in range(width//__CELL_SIZE__-1):
for h in range(height//__CELL_SIZE__-1):
c = np.mean(
np.mean(
mat[h*__CELL_SIZE__:(h+1)*__CELL_SIZE__,
w*__CELL_SIZE__:(w+1)*__CELL_SIZE__], axis=0
),
axis=0
)
mat[
h*__CELL_SIZE__:(h+1)*__CELL_SIZE__,
w*__CELL_SIZE__:(w+1)*__CELL_SIZE__
] = tuple([convertReduceColor(c[0]), convertReduceColor(c[1]), convertReduceColor(c[2]), c[3]])
cv2.imwrite("output.png ",mat)
np.mean(np.mean(mat[h*__CELL_SIZE__:(h+1)*__CELL_SIZE__, w*__CELL_SIZE__:(w+1)*__CELL_SIZE__], axis=0),axis=0)
Hier wird der Durchschnittswert der Pixel aus der Zellengröße erhalten.
Zusätzlich wird "convertReduceColor" verwendet, um eine Annäherungsbeurteilung für jedes RGB vorzunehmen.
Result
Quellbild | Pixel Größe | Nach der Behandlung |
---|---|---|
4 | ||
8 | ||
16 | ||
4 | ||
8 | ||
16 | ||
4 | ||
8 | ||
16 |
――Das erfolgreichste Bild ist eine Katze mit einer Zellengröße von 16. Das rechte Ende wurde nicht bearbeitet, aber ich denke, dass es insgesamt ein Punktbild wie dieses ist. Wenn Sie das rechte Ende auch punktförmig gestalten möchten, müssen Sie die Größenänderung überdenken. ――Bei der Konvertierung in ein Punktbild ist es einfacher, erfolgreich zu sein, wenn eine Abbildung eine Person / ein Objekt enthält. ――Basial ist es ein Bild von Irasutoya, aber das Merkmal ist, dass die Abschnitte mit ungleichmäßigem Filzton gefüllt sind. Daher scheint ein Objekt nicht mit einer einzigen Farbe gefüllt zu sein und Rauschen zu enthalten.
Future ――Ich mache mir Sorgen um Rauschen, daher scheint es bei unregelmäßiger Binärisierung und Morphologieumwandlung ganz so zu sein ――Es ist die tatsächliche Famicom-Farbe, unterscheidet sich jedoch von dem diesmal verwendeten Farbschema. Daher scheint es besser, etwa 50 Farbschemata einzubetten, die mit festen Werten verwendet werden sollen, und sie durch Nachbarschaftssuche abzugleichen.
Reference
Recommended Posts