私は入手方法を探していますビット単位の排他的論理和コマンドラインで 2 つのイメージを (またはプログラムやスクリプトで実装できる別の方法で) 実行します。
これにより、XOR ブレンド モードをサポートする画像エディタ (Paint.NET、Photoshop など) で XOR ブレンド モードを使用した場合と同じ最終画像が得られるはずです。
例えば、私が画像A:
そして画像B:
結果は次のようになります。
もちろん、これの面白いところは、イメージ C とイメージ B を再度 XOR すると、イメージ A の正確なコピーが得られることです。
今、私はこれをプログラムで実行する方法を求めてインターネット中を探していましたが、何も見つかりませんでした。ImageMagick でも、画像に対してビット単位の XOR を実行することはサポートされていません。
誰かこれを行う方法を知っていますか?
ベストアンサー1
ImageMagick ではそれが可能ですが、少し複雑です。 1 つの方法は次のとおりです。
convert img1 img2 -fx "(((255*u)&(255*(1-v)))|((255*(1-u))&(255*v)))/255" img_out
( img1
、、img2
はimg_out
それぞれ 2 つの入力ファイル名と 1 つの出力ファイル名です)。
説明
ちょっと見苦しいですが (私よりも ImageMagick に精通した人ならきれいにできると思いますが)、次のように動作します:
-fx "xxx"
xxx
基本的には「画像に対して操作を実行する」という意味です。上記の式では、u
と はv
それぞれ最初の入力画像と 2 番目の入力画像を表します。現在、ビット演算子としては
-fx
ビットAND&
とビットORのみがあります。ビットXORを再構築するには、|
convert img1 img2 -fx "(u & NOT v) | (NOT u & v)" img_out
NOT
(論理演算はあるNOT
がビット演算はないNOT
)を取得するには、次のことを覚えておく必要がある。NOT x = 255-x
もしx
は 8 ビットです。したがって、 を取得するには、画像が 8 ビットであると仮定して、NOT u
を実行するだけです。したがって、ImageMagick コマンドは次のようになります。255-u
u
convert img1.png img2.img -fx "((255-u)&v)|(u&(255-v))" image_xor.png
-
ここでの 1 つの問題は、ImageMagick が、期待どおりではなく範囲内の
fx
すべてのピクセルを正規化し、非整数に対してビット単位で処理すると、問題が発生してしまうことです。u
v
[0,1]
[0,255]
したがって、私たちは掛け算をしなければなりません全て
u
上記の式内のとの出現回数をv
255 で割って (ビット演算が機能する)、最後に 255 で割って[0,1]
ImageMagick が想定する範囲に戻します。
これにより、元のコマンドは次のようになります。
convert img1 img2 -fx "(((255*u)&(255*(1-v)))|((255*(1-u))&(255*v)))/255" img_out
出来上がり!