乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

モザイク

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

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

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

それでは。

世の中から悪しきモザイクを排除したい!!!

そう考えてプログラマーは立ち上がり
モザイク撲滅委員会を発足しました。

解説動画はこちら

 

さて元ネタは
GIGAZINEさんに載っていたこの記事
「モザイク画像の解像度を64倍にする研究」・・

のリンクにあるGoogleColabのコードです。

コードはこちら

スクリーンショット 2020-07-11 14.39.12


早速試してみるとコードを
実行するだけで試せるようですね。

初回はGithubからのコードのダウンロードなどがあり
少し時間かかります。

容量が結構大きなものをDLするため
場合によっては実行時にエラーになる可能性があります。
(colabの上に注意書きがしてあります。)

その場合は少し時間を置いて待つ必要があるようです。

ネタはこちらのgithubのコードみたいですね。

ダウンロードなどが終わると
画像のアップロードを求められます。

スクリーンショット 2020-07-11 14.41.11
ファイル選択を押して
ファイルを選択しましょう。

今回はこちらのモザイク画像を
使用することにしました。

96chan2

このモザイクが外れたものが生成できれば
晴れてモザイク除去に成功と言えるでしょう!!!

アップロードして暫し待ちます。

ドキドキ!!!

・・・・

・・・

・・



チーーーん
出来上がりました。

結果は!?!?!?!?!?!

download

誰やねん!!!!!!

右側誰やねん!!!


このプログラムは
元の画像とモザイク画像を比べて

モザイクをかけた画像に近くなるような
オリジナル画像を生成するものです。

オリジナルの画像生成の学習に用いられた
画像に近いものを生成しようとするわけで
当然、学習データに無いものは
生成しても精度は程遠いのでした。

まあ当たり前の結果ですねーーー。

うーーーん残念
も少し近めの画像に
なってもらえると良かったのですが

ほんと誰やねん!!!

モザイクと人類の戦いは
まだまだ続くのでした!!

画像処理のプログラムを書いていたら
画像にモザイクをかけるのが
楽しすぎて遊んでしまいました。

解説動画はこちら



モザイクイーーズ!!!



第1問
この画像は誰でしょうか?



moza1


第2問
moza2


第3問
moza3


分かる人には
わかっちゃうかもしれないですね

答えは
動画をご覧くださいませ。

モザイクをかける
コードはこちら
from PIL import Image, ImageFilter
from ipywidgets import interact, FloatSlider, IntSlider
%matplotlib inline

def mozaic(im,i=1,b=4):
    img = im.resize([x // i for x in im.size]).resize(im.size)
    img = img.filter(ImageFilter.GaussianBlur(b))
    return img.resize([x // i for x in img.size]).resize(img.size)

blur_rate = FloatSlider(min=0.1, max=5.0, step=0.1, value=5)
mosaic_pixel = IntSlider(min=1 , max=50,step=1,value=50)

@interact(mosaic_pixel=mosaic_pixel,blur_rate=blur_rate)
def plot(mosaic_pixel,blur_rate):
    im = Image.open('画像のパス')
    im = mozaic(im,mosaic_pixel,blur_rate)
    return im

JupyterNotebookに貼り付けて
画像のパスを入力して
実行すると
スライダーウィジェットと
モザイク画像が出ます。


mosaic_pixel
20
blur_rate
5.00

あとはスライダーで
mosaic_pixel(モザイクの粒度,ピクセル数)と
blur_rate(ブラー,ぼかしの強さ)を
変えると・・・

画像のモザイクの粒度を1ピクセルに向かって小さくすれば
モザイクイズできます。
ブラーはモザイクが強いと効果ないですので
モザイク小さくして頂くと変化してきます。

面白いので
試してみてください。

それでは

このページのトップヘ