前提・実現したいこと
Python - Pythonで、いくつかの指定した色に似た色になるように、画像のピクセルを置き換えたい|teratail - https://teratail.com/questions/323033
上記の質問、回答を参考にPythonで画像を任意の16色に近似、減色させようとしていますが、パレット表示までは走りますがエラーが出て結果は出力されません。
発生している問題・エラーメッセージ
次元違いのエラーが出ているようですが解決出来ません。
error
1Traceback (most recent call last): 2 File "c:\Users\user\Documents\kinji_question.py", line 56, in <module> 3 diff = color.deltaE_ciede2000(np.expand_dims(img_lab, axis=2), palette_lab) 4 File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\color\delta_e.py", line 208, in deltaE_ciede2000 5 L2, a2, b2 = np.moveaxis(lab2, source=channel_axis, destination=0)[:3] 6 File "<__array_function__ internals>", line 5, in moveaxis 7 File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\numeric.py", line 1454, in moveaxis 8 source = normalize_axis_tuple(source, a.ndim, 'source') 9 File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\numeric.py", line 1385, in normalize_axis_tuple 10 axis = tuple([normalize_axis_index(ax, ndim, argname) for ax in axis]) 11 File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\numeric.py", line 1385, in <listcomp> 12 axis = tuple([normalize_axis_index(ax, ndim, argname) for ax in axis]) 13numpy.AxisError: source: axis 3 is out of bounds for array of dimension 2
該当のソースコード
Python
1#Python - Pythonで、いくつかの指定した色に似た色になるように、画像のピクセルを置き換えたい|teratail - https://teratail.com/questions/323033 2 3import numpy as np 4from matplotlib import pyplot as plt 5from PIL import Image 6from skimage import color, io 7 8# パレット一覧 (R, G, B) 9palette_rgb = np.array( 10 [ 11 ( 0, 0, 0), 12 ( 20, 29, 44), 13 ( 60, 46, 26), 14 ( 27, 51, 92), 15 (155, 543, 31), 16 (107, 80, 51), 17 ( 52, 89, 152), 18 ( 87, 84, 90), 19 (134, 90, 14), 20 ( 98, 131, 195), 21 (232, 127, 24), 22 (126, 164, 7), 23 (195, 141, 94), 24 (180, 151, 148), 25 (234, 183, 138), 26 (255, 255, 255), 27 ], 28 dtype=np.uint8, 29) 30 31 32def show_pallets(palette): 33 fig = plt.figure(figsize=(5, 10)) 34 for i, color in enumerate(palette, 1): 35 color_img = np.full((1, 10, 3), color, dtype=np.uint8) 36 37 ax = fig.add_subplot(len(palette), 1, i) 38 ax.imshow(color_img, aspect="auto") 39 ax.set_axis_off() 40 ax.text(-1, 0, i, va="center", ha="right", fontsize=10) 41 42 plt.show() 43 44# パレットの色を確認 45show_pallets(palette_rgb) 46 47 48# 画像を読みこむ。 49img_rgb = io.imread("susi.jpg") 50 51# Lab 色空間に変換する。 52img_lab = color.rgb2lab(img_rgb) 53palette_lab = color.rgb2lab(palette_rgb) 54 55# 色差を計算する。 56diff = color.deltaE_ciede2000(np.expand_dims(img_lab, axis=2), palette_lab) 57 58# 一番近い色のインデックスを求める。 59indices = diff.argmin(axis=-1) 60 61# 一番近い色で出力画像を生成する。 62dst_rgb = palette_rgb[indices] 63 64# 比較するために元画像と結果画像を結合 65merged = np.concatenate((img_rgb, dst_rgb)) 66 67# 保存する。 68io.imsave("susiresult.jpg", merged)
補足情報(FW/ツールのバージョンなど)
Python 3.10.0
matplotlib 3.5.0
numpy 1.21.4
Pillow 8.4.0
scikit-image 0.19.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。