2021年あけましておめでたです。

新年1発目は
モザイクで遊んでいきたいと思います。


動画はこちら



さてモザイクに関してですが
モザイクと言うのは

非可逆変換
一定領域の色情報を読み込んで
その平均値で画像を処理する方法や

一定領域の代表値で
全体を塗りつぶす方法がある

このモザイク処理を施したものは
元に戻すことができない。

可逆変換
処理範囲を縦横に分割して
並べ替えるという方法などがある

このモザイク処理は
元に戻すことが可能

ということになってます。

一般的なモザイクと言うのは
非可逆変換の方で
外すことは出来ませんが

今回のは可逆変換の外せる方を
やっていきたいと思います。

プログラムのソースコードはこちら
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline

# 画像表示
def plt_img(img):
    plt.figure(figsize=(20,10))
    plt.imshow(img)
    plt.axis('off')
    plt.show()

# モザイク処理(mode0:モザイクをかける,mode1:モザイクを外す)
def mosaic(image,mode=0):
    pix = image.load()
    wid, hei = image.size
    s = wid * hei
    if mode==0:
        for _ in range(2):
            fl = [pix[x, y][rgb] for y in range(hei) for x in range(wid) for rgb in range(3)]
            rgb = zip(fl[:s] , fl[s:s*2] , fl[s*2:])# rgbの入れ替え
            for y in range(hei):
                for x in range(wid):
                    pix[x, y] = next(rgb)
    elif mode==1:
        for _ in range(2):
            fl = [pix[x, y][rgb] for rgb in range(3) for y in range(hei) for x in range(wid)]
            rgb = zip(fl[0::3],fl[1::3],fl[2::3])# rgbの入れ替え
            for y in range(hei):
                for x in range(wid):
                    pix[x, y] = next(rgb)

# マスク処理(mode0:マスクをかける,mode1:マスクを外す)
def mask(file_path,mode=0,m_x=(0,0),m_y=(0,0)):
    img = Image.open(file_path)
    tmp = img.copy()
    if m_x!=(0,0) and m_y!=(0,0):
        tmp = img.crop((m_x[0], m_y[0], m_x[1], m_y[1]))
    if mode==0:
        mosaic(tmp,0)
        img.paste(tmp, (m_x[0], m_y[0]))
        out_path = file_path.replace('.','_masked.'.format())
    elif mode==1:
        mosaic(tmp,1)
        img.paste(tmp, (m_x[0], m_y[0]))
        out_path = file_path.replace('_masked','_unmasked'.format())
    img.save(out_path,quality=0)
    plt_img(img)
使い方は2通りあり
mode0がモザイクをかける
mode1がモザイクを外す
になっています。


使い方は
file_path = 'ファイル名.png'
m_x = (横の始まり,横の終わり)
m_y = (縦の始まり,縦の終わり)
mask(file_path,モード(0 or 1),m_x,m_y)
となっております。

画像にかけてみると
download
こんな感じでモザイクがかかります。

縦横の座標を指定しない場合は
全体にかかります。

画像を処理すると
「ファイル名_masked.png」
と言う名前で保存されます。

このマスク済みの画像を元に戻すには
mode1で縦横の座標を指定して戻します。

一応png画像のみ対応です。
jpegは元に戻せませんので
気をつけてください。

その昔の話ですが
FLMASK(エフエルマスク)

なんて言うものがありましたねー

一斉を風靡した外せるモザイクをかける
画像処理(マスク)ソフトです。

仕組みとしては画像の範囲の内の
RGBを入れ替えるもので
今回のプログラムと同様ですが

外せるモザイクは
モザイクをかけたことにはならず
猥褻画像にかけて
配布をしてしまった場合
大問題になってしまいました。

ですので、このプログラムも
かける画像は問題の無い画像を用いて
遊び程度にしていただく必要がありまーす。

お気をつけてwww

こんな感じで今年も
たくさん遊んでいきたいと
思いますので

ネタがあったら
コメントくださいませ。

それでは。