こんにちは、ヒガシです。
先日私のブログに以下のようなお問い合わせがありました。
映像内の特定領域(or全体)を復元可能な方法でモザイク、マスクしたいと思ってます。(別に変なことに使うわけではありません。。)
復元する方法を知っている人しか全体を見れないようにしたいというセキュリティ側の目的です。
もし考える時間がありまして、一言でもアイディアあればアドバイスほしいなと思いました。
全然、聞き流してもらっても構いません。よろしくおねがいします。
今回はこのお悩みを私なりに解決していきたいと思います。
(返信できれおらず、また回答が遅くなってしまい申し訳ありません。)
というわけでさっそくやっていきましょう。
サンプル画像の紹介
今回は以下のカラー画像をつかって実演していきたいと思います。
以降の項目ではこの画像に対して
①モザイク化処理を行う
②①でつくったモザイク画像を元の画像に復元する
という2つのプログラムを紹介していきます。
復元可能な状態でモザイク処理する方法
それでは復元可能な状態でモザイク処理するサンプルコードをご紹介します。
#ライブラリインポート
import cv2
import numpy as np
#モザイク化処理
file_name='sample.jpg'
img=cv2.imread(file_name,cv2.IMREAD_COLOR)
h,w=img.shape[:2]
d=20
dd=d//2
new_pic=img
for i in range(dd,w-dd,d):
for j in range(dd,h-dd,d):
new_pic[j-dd:j+dd,i-dd:i+dd,:] =np.flipud(img[j-dd:j+dd,i-dd:i+dd,:])
cv2.imwrite('mosaic.jpg',new_pic)
やっていくこととしては画像を20(プログラムの変数d)ピクセルの領域に分解し、その領域内のピクセルを上下反転させるという処理を左上から右下にかけて順番に実行しているだけです。
こいつを実行すると以下の画像が出力されました。
いい感じにぼやけていますね。
dの値を大きくすればよりぼやけ度合が大きくなるはずです。
(かつ処理も高速化します。)
というわけでまずはモザイク処理を実施できました。
モザイク画像を元の画像に復元する方法
次はこの画像(mosaic.jpg)を復元する方法をご紹介します。
以下がそのサンプルコードです。
#ライブラリインポート
import cv2
import numpy as np
#モザイクからの復元処理
d=20
dd=d//2
img2=cv2.imread('mosaic.jpg',cv2.IMREAD_COLOR)
h2,w2=img2.shape[:2]
new_pic2=img2
for i in range(dd,w2-dd,d):
for j in range(dd,h2-dd,d):
new_pic2[j-dd:j+dd,i-dd:i+dd,:] =np.flipud(img2[j-dd:j+dd,i-dd:i+dd,:])
cv2.imwrite('restore.jpg',new_pic2)
やっていることは単純で先ほどのモザイク化処理を逆再生しているだけですね。
※ここで使用する変数dは先ほどのモザイク化プログラムで使用した値と同じ値を使用するようにしましょう。
できあがったrestore.jpgを確認してみましょう。
問題なくもとの滑らかな画像に復元できていますね。
おわりに
というわけで今回はpython-openCVを使って、画像を復元可能な状態でモザイク化処理する方法&モザイク画像の復元方法をご紹介しました。
質問者さんのご期待に応えられているかはわかりませんが、私ならこんな感じで処理しますね。
最近ネタ切れぎみなので何か困ったことがあればいつでもコメント欄からご質問ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント
質問者です。
検討および例までありがとうございます!
dの値だけ管理すればいいので、相変わらずでシンプルでいいと思いました!
このシンプルさが思いつきません。
私も並行して、検討していて、OPENCVにも実装されているXORを2回演算するとに戻る仕組みを利用してやろうかと進めてました。もはやモザイクじゃなくないですが。
単純にやると復元後グレースケールになるのでそこで止まってますが、、
ブログの例を参考に試して進めたい思います。ありがとうございました。
ご確認ありがとうございます(^^)
処理速度が期待に応えられているか不安ですがお役に立てたようで何よりです。
また何かあればいつでもご連絡ください!