画像処理100ノックQ.6. 減色処理についての解説記事です。
減色処理は、R(赤),G(緑),B(青)それぞれのとりうる値の種類を限定します。それにより、表現できる色が減ります。
本題ではR,G,Bが各256種類の値(0~255)を取れていたものを、各4種類の値(32,96,160,224)に減らすように指示されています。
元記事ではこちらの処理によって、減色処理を行っています。(下記)
def dicrease_color(img):
out = img.copy()
out = out // 64 * 64 + 32
return out
思っていたより処理が少なくてびっくりしました。この関数の下記の部分のコードで減色処理を行っています。
out = out // 64 * 64 + 32
この64と言う数字は256(0~255)を4で割った値です。
つまり、out // 64
とは256を4分割した際のどのクラス(0, 1, 2, 3と言う風に4クラスあるものとする)に属するかを調べていることになります。
そして* 64 + 32
とすることでそのクラスの定められた値にしています。(クラス0なら32、クラス1なら96、クラス2なら160、クラス3なら224と定められています。)今回はそのクラス内の中央付近の値にしているようです。(クラス0に属する値は0~63で、その中央は32と33)
例えばout // 64
が2だった場合(クラス2)、つまりout
が128~191だった場合は、out // 64
で2となり、* 64 + 32
とすることでクラス2の定められた値(160)としています。
以上のことが理解できれば各2値や各6値、8値など思うように減色
処理を行うことができます。以下参考までにコードを提示しておきます。(※Google Colaboratoryを使用しています。画像の読み込みなどに少し処理が必要です。私はGoogle Colabでcv2.imshow() を利用する方法を参考にしました。)
# サポートパッチのインポート
from google.colab.patches import cv2_imshow
# 画像のインポート
!curl -o logo.png https://colab.research.google.com/img/colab_favicon_256px.png
import cv2
# 画像を読み込み、imgに格納
img = cv2.imread("imori.jpg", cv2.IMREAD_UNCHANGED)
# imと言う変数にimgをコピー
im = img.copy()
# 画像を表示
cv2_imshow(im)
各2値に分類
sample = im // 128 * 128 + 64
cv2_imshow(sample)
各3値に分類
sample = im // 85 * 85 + 42
cv2_imshow(sample)
各4値に分類(元記事通り)
sample = im // 64 * 64 + 32
cv2_imshow(sample)
各6値に分類
sample = im // 43 * 43 + 22
cv2_imshow(sample)
各8値に分類
sample = im // 32 * 32 + 16
cv2_imshow(sample)
各8値まで表現できるだけで、かなり画質が良いと言うのは驚きですね。
以上です。引き続き画像処理100ノックに取り組みましょう。