見出し画像

見えないウォーターマーク(macOS)を使ってみよう

見えないウオーターマーク(Invisible Watermark)とは

目に見えるロゴなどではなく、見えない情報を画像に埋め込むという技術です。
実際にはわずかに画像の見た目も変化しているのですが、ほとんど知覚できない形で情報を埋め込みます。
情報を取り出す際はQRコードの様にソフトウエアで情報を取り出します。
オープンソースのツールを見つけました。
専門知識がなくてもなんとか導入できるヒント程度に手順を解説します。

手順

手順1 HomeBrewを使える様にします

HomeBrewをインストールします。
HomeBrewが何かはとりあえず気にしないで大丈夫です。
mac使いの間では、割といろんなことのために使われていますので、
すでに何か別のことで設定済みなら飛ばしてください。

Terminalアプリケーションを開き、Xcodeコマンドラインツールをインストールしてください。

xcode-select --install

Brew本体をインストールします
以下のサイト(英語)に手順がありますがまずは以下を実行します

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Apple Silicon(M1・M2プロセッサなど)では、若干手こずる要素があります。
詳しく書き始めると、それだけで記事になってしまいますが、
ネットにはいっぱい記事があるのと、もし記事にしても時間が経つとmacOSのバージョンアップなどの理由で、その通りではうまくいかなくなる可能性があるので、他の人の記事を検索してとにかくHomeBrewのインストールを成功させてください。

参考: Apple Silicon で必要なこと
nano ~/.zshrcファイルを編集し、以下を挿入します。

arm="env /usr/bin/arch -arm64 /bin/zsh --login"
alias intel="env /usr/bin/arch -x86_64 /bin/zsh --login"
export PATH=/usr/local/opt/node/bin:$PATH

Cmd + Oを押してファイルを保存し、Cmd + Xを押してnanoから終了します。ターミナルsource ~/.zshrcで実行して変更をロードします。

手順2 Pythonのインストールをします

以下のサイトの手順をのうち必要だったものを抜き出しています

ツールをインストールしていきます。

brew install memcache
・いっぱい表示されます
brew services start memcached
・何か表示されます
brew install git
・いっぱい表示されます
brew install mysql
・いっぱい表示されます
brew services start mysql
・何か表示されます
brew install postgresql
・いっぱい表示されます
brew services start postgresql@14
・何か表示されます
brew install node 
・いっぱい表示されます
brew install wget
・いっぱい表示されます

もし以下の様なメッセージが出た場合は

Error: You have not agreed to the Xcode license. Please resolve this by running:
  sudo xcodebuild -license accept

以下を実行します。

sudo xcodebuild -license accept
Password:

PasswordはmacOSのユーザパスワードを打ち込みます。

システム変更

nano ~/.zshrcファイルを編集し、このコンテンツを挿入します。

※「このコンテンツ」に関してはApple Siliconの場合以下の変更を行なってください。
※ 2023/11/5 変更が必要な箇所を追加しました。

  • 変更前

export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
homebrew=/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin
  • 変更後

export VIRTUALENVWRAPPER_PYTHON=/opt/homebrew/bin/python3
source /opt/homebrew/bin/virtualenvwrapper.sh
homebrew=/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/mysql/bin

Cmd + Oを押してファイルを保存し、Cmd + Xを押してnanoから終了します。ターミナルsource ~/.zshrcで実行して変更をロードします。

python本体のインストール

以下は私のmac(M2 macMini / macOS 13.6.1) で必要だった手順です。
pythonのバージョンや機材の状態で変わるので参考程度です・

brew install python
pip3 install virtualenv virtualenvwrapperpipコマンドは受け付けず、pip3を受け付けました)
python3.11 -m pip install --upgrade pip

手順3 invisible-watermarkのインストールをします

以下のコマンドを実行します

pip install invisible-watermark

手順4 テスト

invisible-watermarkのインストール場所は以下の場所になりました。
上記のステップの中にある.zshrcの修正済みであれば、パスが通っています。

/opt/homebrew/bin/invisible-watermark

変換

invisible-watermark -v -a encode -t bytes -m dwtDct -w 'Photo by Kujirano Setaro' -o ~/Desktop/test.jepg /Volumes/SSD\ 2048GB/UsersExternal/mizoi/Pictures/20231029/DSC05709.JPG

エラーになってしまいました(汗)

watermark length: 192
encode time ms: 547.752857208252
Traceback (most recent call last):
  File "/opt/homebrew/bin/invisible-watermark", line 106, in <module>
    sys.exit(main())
             ^^^^^^
  File "/opt/homebrew/bin/invisible-watermark", line 81, in main
    cv2.imwrite(args.output, bgr_encoded)
cv2.error: OpenCV(4.8.1) /Users/xperience/GHA-OpenCV-Python/_work/opencv-python/opencv-python/opencv/modules/imgcodecs/src/loadsave.cpp:696: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'imwrite_'

そんな拡張子は知らないよ、とのことです。"jepg"だとダメな様です。
気を取り直して。

invisible-watermark -v -a encode -t bytes -m dwtDct -w 'Photo by Kujirano Setaro' -o ~/Desktop/test.jpg /Volumes/SSD\ 2048GB/UsersExternal/mizoi/Pictures/20231029/DSC05709.JPG
watermark length: 192 
encode time ms: 534.492015838623

埋め込み成功しました!
ぱっと見、画像の変化は全く分かりません。

情報が取り出せるか、確認します。

invisible-watermark -v -a decode -t bytes -m dwtDct -l 192 ~/Desktop/test.jpg 
decode time ms: 327.8779983520508
Traceback (most recent call last):
  File "/opt/homebrew/bin/invisible-watermark", line 106, in <module>
    sys.exit(main())
             ^^^^^^
  File "/opt/homebrew/bin/invisible-watermark", line 99, in main
    wm = wm.decode('utf-8')
         ^^^^^^^^^^^^^^^^^^

またエラーです。

どうもその後調べたところ、 dwDct, dwdDctSvd, RivaGan の方式のうち、dwDctはなぜかうまく動作せず、また、RivaGanは4文字の埋め込み限定のようです。気を取り直してやり直し。

埋め込み

invisible-watermark -v -a encode -t bytes -m dwtDctSvd -w 'Photo by Kujirano Setaro' -o ~/Desktop/test.jpg /Volumes/SSD\ 2048GB/UsersExternal/Pictures/20231029/DSC05709.JPG 
watermark length: 192
encode time ms: 1376.903772354126

取り出し

invisible-watermark -v -a decode -t bytes -m dwtDctSvd -l 192 ~/Desktop/test.jpg
decode time ms: 841.2570953369141
Photo by Kujirano Setaro

やっと成功しました。

手順5 結果

変換前と変換後の画像と、フォトショップによる差分の検証()を貼っておきます。

埋め込み前
埋め込み後
2つの画像をレイヤーで除算

二つの画像が全く同じなら除算すればX=Y; X÷Y=1で、一面ピクセル値は1(白に限りなく違い灰色)になるはずですが、少し差異があり、情報が埋め込まれていることがわかります。

コマンドラインではとても使いにくいため、今度は、AppleScriptでドロップレットを作っておこうと思います


この記事が気に入ったらサポートをしてみませんか?