質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3743閲覧

Pythonによる画像の任意色への減色処理

hajipy

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/28 07:56

編集2021/12/28 08:14

前提・実現したいこと

Python - Pythonで、いくつかの指定した色に似た色になるように、画像のピクセルを置き換えたい|teratail - https://teratail.com/questions/323033
上記の質問、回答を参考にPythonで画像を任意の16色に近似、減色させようとしていますが、パレット表示までは走りますがエラーが出て結果は出力されません。
susi.jpg

発生している問題・エラーメッセージ

次元違いのエラーが出ているようですが解決出来ません。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーの発生場所は以下になります。

scikit-image/delta_e.py at main

python

1L1, a1, b1 = np.moveaxis(lab1, source=channel_axis, destination=0)[:3] 2L2, a2, b2 = np.moveaxis(lab2, source=channel_axis, destination=0)[:3]

lab1img_lablab2palette_lab になります。ここで palette_lab の軸を移動しようとしていますが(30)、palette_labndim2(shape(16, 3))なのでエラーとなっています。なので、以下の様に変更します(palette_labndimimg_labndim に合わせる)。

python

1# 色差を計算する。 2#diff = color.deltaE_ciede2000(np.expand_dims(img_lab, axis=2), palette_lab) 3diff = color.deltaE_ciede2000(np.expand_dims(img_lab, axis=2), palette_lab.reshape(1, 1, -1, 3))

susiresult.jpg
寿司

以下は dst_rgb の内容を PNG 形式で保存した場合の color histogram です。

Histogram

1Colors: 16 2Histogram: 3 31351: ( 0, 0, 0) #000000 black 4 33542: ( 20, 29, 44) #141D2C srgb(20,29,44) 5 45126: ( 27, 51, 92) #1B335C srgb(27,51,92) 6 35242: ( 52, 89,152) #345998 srgb(52,89,152) 7 24638: ( 60, 46, 26) #3C2E1A srgb(60,46,26) 8 8049: ( 87, 84, 90) #57545A srgb(87,84,90) 9 6217: ( 98,131,195) #6283C3 srgb(98,131,195) 10 5909: (107, 80, 51) #6B5033 srgb(107,80,51) 11 1152: (126,164, 7) #7EA407 srgb(126,164,7) 12 5664: (134, 90, 14) #865A0E srgb(134,90,14) 13 6705: (155, 31, 31) #9B1F1F srgb(155,31,31) 14 11835: (180,151,148) #B49794 srgb(180,151,148) 15 22402: (195,141, 94) #C38D5E srgb(195,141,94) 16 9959: (232,127, 24) #E87F18 srgb(232,127,24) 17 30890: (234,183,138) #EAB78A srgb(234,183,138) 18 11719: (255,255,255) #FFFFFF white

投稿2021/12/28 17:51

編集2021/12/28 17:55
melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問