Background Il ne s'agit pas de l'amélioration directe de l'image de points, mais j'ai transformé l'image d'Irasutoya en une image de points. (part1), l'image environnante n'a pas pu être convertie en points, je vais donc expliquer la solution.
Method
En guise de méthode, préparez une image qui est deux fois la largeur et la hauteur de l'image d'origine. L'image est une image de mettre un sandwich sur un 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__":
#L'image originale
mat = cv2.imread(path,cv2.IMREAD_UNCHANGED)
#Pliez la largeur et la hauteur en deux
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)
Il est facile à comprendre par son apparence et il est réglé sur «G = 255» et «α (transparence) = 128».
Ensuite, placez l'image que vous souhaitez créer une image à points au centre.
wrap[top:top + mat.shape[0], left:left + mat.shape[1]] = mat
cv2.imwrite("wrap.png ", wrap)
Ensuite, convertissez-le en une image à points. Des lignes grises sont générées autour d'elle, mais je pense que c'est parce que la valeur moyenne de la disposition des couleurs et de la couleur transparente de l'image d'habillage a été calculée sur la ligne de démarcation.
Puis découpez cette image à la taille de l'image d'origine.
cv2.imwrite("trim.png ",wrap[top:top + mat.shape[0], left:left + mat.shape[1]])
Je me demandais si une ligne grise resterait sur le bord, mais j'ai pu sortir comme prévu. S'il est affiché, il n'y a pas de problème si vous définissez la disposition des couleurs de l'image d'habillage sur (R, V, B, A) = (0,0,0,0)
.
Development
L'ensemble du 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)
#Création d'image enveloppante
wrap = wrapMat(top * 4, left * 4)
#Placez l'image d'origine
wrap[top:top + mat.shape[0], left:left + mat.shape[1]] = mat
#Création d'images par points
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]])
#garniture
trim = wrap[top:top + mat.shape[0], left:left + mat.shape[1]]
cv2.imwrite("trim.png ", trim)
if __name__ == "__main__":
main()
Future La prochaine fois, réfléchissons à la façon de créer une image monochrome en quatre couleurs.
Reference
Recommended Posts