[PYTHON] J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)

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)

out.png

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
group_young_people.png 4 output_group.png
group_young_people.png 8 output.png
group_young_people.png 16 output.png
animal_chara_computer_penguin.png 4 output.png
animal_chara_computer_penguin.png 8 output.png
animal_chara_computer_penguin.png 16 output.png
cat_koubakozuwari_gray.png 4 output.png
cat_koubakozuwari_gray.png 8 output.png
cat_koubakozuwari_gray.png 16 output.png

――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.

ファミコンの画面について.png

Reference

Recommended Posts

J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 2)
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai fait un bot mou qui m'informe de la température
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
J'ai fait une sorte d'outil de traitement d'image simple en langage Go.
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
[Python + OpenCV] Peignez la partie transparente de l'image en blanc
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
J'ai créé un outil pour sauvegarder automatiquement les métadonnées de l'organisation Salesforce
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
〇✕ J'ai fait un jeu
Découpez une partie de la chaîne à l'aide d'une tranche Python
J'ai créé une boîte de changement de seuil pour Pepper's Dialog
J'ai essayé d'effacer la partie négative de Meros
J'ai fait une commande pour marquer le clip de la table
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)
[Python / C] J'ai créé un appareil qui fait défiler sans fil l'écran d'un PC à distance.
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber (édition Google Calendar)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai créé une application Twitter qui identifie et enregistre l'image d'un personnage spécifique sur la chronologie de Twitter par pytorch transfer learning
J'ai essayé de faire un classement en grattant l'équipe des membres de l'organisation
J'ai créé un outil pour obtenir les liens de réponse d'OpenAI Gym en même temps
Résumé de l'exploration d'image effectuée à la vitesse d'une seconde
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
J'ai essayé un peu le comportement de la fonction zip
J'ai fait un texte Python
TensorFlow change-t-il l'image de l'apprentissage profond? Ce que j'ai pensé après avoir touché un peu
J'ai fait un robot discord
L'image est Namekuji
J'ai écrit un script qui divise l'image en deux
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
Une méthode de conversion du style d'une image tout en préservant la couleur
J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
[Statistiques] Saisir l'image de la théorie de la limitation du pôle central avec un graphe
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
[Go] Créez une commande CLI pour changer l'extension de l'image
J'ai fait réfléchir AI aux paroles de Genshi Yonezu (pré-traitement)
J'ai étudié avec Kaggle Start Book basé sur kaggle [Partie 1]
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 1)
J'ai fait réfléchir AI aux paroles de Genshi Yonezu (implémentation)
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle