Motive Comme vous le savez, Irasutoya continue de publier du matériel gratuit à la mode. Soudain, je me demandais ce qui se passerait si ces images étaient transformées en images par points, alors je les ai créées.
Method Comme je l'ai écrit dans Wizard's Forest, il est dit que la couleur d'affichage de Famicom est d'environ 52. (Pas déterministe.) Ici, pour le faire ressembler à une Famicom, j'essaierai de réduire la disposition des couleurs de chacun des R, V et B en 4 parties et de l'afficher.
Chaque plage va de «0 à 255», mais si vous la divisez simplement, vous obtenez «[0, 85, 170, 255]».
Toutes les combinaisons de couleurs ont un motif «64», mais lorsque vous le sortez réellement en tant qu'image, il sera affiché comme suit.
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)
En passant, je pensais qu'il n'y avait pas de couleur grise à première vue, mais elle est affichée en 2 lignes et 6 colonnes (85,85,85)
et 3 lignes et 11 colonnes(170,170,170)
, respectivement.
Alors, comment juger par le nombre de données de couleur d'origine, mais à titre d'exemple, si vous voulez distribuer la valeur de «110», jugez ce qui est plus proche de «85 ~ 170». Puisque «85» est le plus proche ici, convertissez-le en «110-> 85» et appliquez cet algorithme à tous les pixels.
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)
Ici, la valeur moyenne des pixels est obtenue à partir de la taille de la cellule.
De plus, convertReduceColor
est utilisé pour faire un jugement d'approximation pour chaque RVB.
Result
Image source | Taille de pixel | Après le traitement |
---|---|---|
4 | ||
8 | ||
16 | ||
4 | ||
8 | ||
16 | ||
4 | ||
8 | ||
16 |
――L'image la plus réussie est un chat avec une taille de cellule de 16. L'extrémité droite n'a pas été traitée, mais je pense que c'est une image de points comme celle-là dans son ensemble. Si vous voulez que l'extrémité droite soit également en forme de point, vous devez reconsidérer le processus de redimensionnement. ――Lors de la conversion en image à points, il est plus facile de réussir s'il y a une personne / un objet dans une illustration. «Fondamentalement, c'est une image d'Irasutoya, mais la particularité est que les sections sont remplies d'un ton de feutre irrégulier. Par conséquent, il semble qu'un objet ne soit pas rempli d'une seule couleur et contienne du bruit. --Les yeux de l'image du pingouin avec la taille de cellule réglée sur 4 sont (´ ・ ω ・ `). Veuillez noter que le caractère d'Irasutoya a essentiellement les yeux sous forme de points et qu'il est petit, il disparaît donc lorsque la taille de la cellule est augmentée.
Future Je m'inquiète du bruit, donc cela semble tout à fait le cas avec une binarisation irrégulière et une conversion de morphologie ――C'est la couleur réelle de Famicom, mais elle est différente du jeu de couleurs utilisé cette fois, il semble donc préférable d'incorporer environ 50 jeux de couleurs à utiliser avec des valeurs fixes et de les faire correspondre par recherche de quartier.
Reference
Recommended Posts