実現したいこと
・正方形の画像を1000×1000にリサイズする
・画像から最も頻度の高い2色を抽出する
・その2色で画像を置き換える
・出力された画像に違和感がないように、ふちを滑らかにするなどの処理を追加したい
!!!!!発生している問題!!!!!
・置き換え前のふち部分が、置き換え後におかしくなっている
・ふち部分がなめらかでない
ソースコードを求めているというよりは、アイデアを募集しています。
該当のソースコード
import cv2 import numpy as np def extract_top_colors(image, num_colors): #上位2色を抽出する関数 # 画像をリサイズ desired_size = (1000, 1000) resized_image = cv2.resize(image, desired_size) # 画像を1次元の配列に変換 pixels = resized_image.reshape(-1, 3) # 色の頻度を計算 unique_colors, color_counts = np.unique(pixels, axis=0, return_counts=True) # 頻度の高い色を抽出 top_colors_indices = np.argsort(color_counts)[::-1][:num_colors] top_colors = np.array(unique_colors[top_colors_indices]) return top_colors def replace_colors(image, top_colors): #色の置き換えを行う関数 # 画像の高さと幅を取得 height, width = image.shape[:2] # 画像を走査して近い値と入れ替える for y in range(height): for x in range(width): pixel = image[y, x] # 走査中のピクセル値 # ピクセル値とtop_colorsの各色との距離を計算 distances = np.linalg.norm(top_colors - pixel, axis=1) # 最も近い色のインデックスを取得 closest_index = np.argmin(distances) # 最も近い色でピクセル値を置き換える image[y, x] = top_colors[closest_index] return image def main(): # 画像の読み込み image = cv2.imread('Test.png') # 上位2つの色を抽出 num_colors = 2 top_colors = extract_top_colors(image, num_colors) # 色の置き換え processed_image = replace_colors(image, top_colors) # 処理後の画像の保存 cv2.imwrite('processed_image.png', processed_image) if __name__ == '__main__': main()
上:置き換え前 下:置き換え後
変換前の画像の条件
①正方形であり、1000×1000ピクセル未満のもの
②添付画像のような、若干画質が荒いもの(ふちなど)
③(拡大するとふち部分が2色ではないですが)パっと見て2色である画像
まずは、なめらか、ってところをコード実装可能なようにきちんと定義することから始めよう。
なめらか、というのはどういうことなんでしょうか
(自分はそのコード読めないので実装に関する具体的指摘はできませんが)
結果例だけを見ると,色の置き換え処理の実装が バグっている/目的に関して適切でない という話に思える.
だって,結果が明らかに不自然.
世間一般で言うところの「減色処理」ではそんな結果にならない気がするので,「減色処理」の方法論等について調べてみてはどうでしょう?
> ふち部分がギザギザしてます。これをなめらかにしたい
ぼかしてから2値化したら、いかがでしょうか
参考
https://teratail.com/questions/204418
の質問の「図1」の、「左上」と「右上」と「右下」
