Background Es geht nicht um die direkte Verbesserung des Punktbildes, sondern ich habe das Bild von Irasutoya zu einem Punktbild gemacht. (Teil1) konnte das umgebende Bild nicht in Punkte konvertiert werden, daher werde ich die Lösung erläutern.
Method
Bereiten Sie als Methode ein Bild vor, das doppelt so breit und hoch ist wie das Originalbild. Das Bild zeigt ein Sandwich auf einem Wrap: Hamburger:
def wrapMat(height, width):
dst = np.zeros((height, width, 4), np.uint8)
dst[:] = tuple((0,255,0,128))
return dst
if __name__ == "__main__":
#Das Originalbild
mat = cv2.imread(path,cv2.IMREAD_UNCHANGED)
#Falten Sie die Breite und Höhe in zwei Hälften
top = int(mat.shape[0] * 0.5)
left = int(mat.shape[1] * 0.5)
wrap = wrapMat(top*4,left*4)
cv2.imwrite("mono_wrap.png ", wrap)
Es ist vom Aussehen her leicht zu verstehen und auf "G = 255" und "α (Transparenz) = 128" eingestellt.
Platzieren Sie als Nächstes das Bild, für das Sie ein Punktbild erstellen möchten, in der Mitte.
wrap[top:top + mat.shape[0], left:left + mat.shape[1]] = mat
cv2.imwrite("wrap.png ", wrap)
Konvertieren Sie es dann in ein Punktbild. Um ihn herum wird eine graue Linie erzeugt, aber ich denke, das liegt daran, dass der Durchschnittswert der Farbanordnung und der transparenten Farbe des Umbruchbilds auf der Grenzlinie berechnet wurde.
Schneiden Sie dieses Bild dann auf die Größe des Originalbilds.
cv2.imwrite("trim.png ",wrap[top:top + mat.shape[0], left:left + mat.shape[1]])
Ich habe mich gefragt, ob eine graue Linie am Rand bleiben würde, aber ich konnte wie erwartet ausgeben. Wenn es angezeigt wird, ist es kein Problem, wenn Sie die Farbanordnung des Umbruchbilds auf "(R, G, B, A) = (0,0,0,0)" setzen.
Development
Der ganze Code.
import cv2
import numpy as np
import sys
def wrapMat(height, width):
dst = np.zeros((height, width, 4), np.uint8)
dst[:] = tuple((0, 255, 0, 128))
return dst
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]
def main():
CELL_SIZE = 16
path = sys.argv[1]
mat = cv2.imread(path, cv2.IMREAD_UNCHANGED)
top = int(mat.shape[0] * 0.5)
left = int(mat.shape[1] * 0.5)
#Wrap-Image-Erstellung
wrap = wrapMat(top * 4, left * 4)
#Platzieren Sie das Originalbild
wrap[top:top + mat.shape[0], left:left + mat.shape[1]] = mat
#Punktbilderstellung
height, width = wrap.shape[:-1]
for w in range(width // CELL_SIZE - 1):
for h in range(height // CELL_SIZE - 1):
c = np.mean(
np.mean(
wrap[h * CELL_SIZE:(h + 1) * CELL_SIZE,
w * CELL_SIZE:(w + 1) * CELL_SIZE], axis=0
),
axis=0
)
wrap[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]])
#Trimmen
trim = wrap[top:top + mat.shape[0], left:left + mat.shape[1]]
cv2.imwrite("trim.png ", trim)
if __name__ == "__main__":
main()
Future Lassen Sie uns das nächste Mal darüber nachdenken, wie Sie ein monochromes Bild in vier Farben umwandeln können.
Reference
Recommended Posts