画像に対してビット単位のXORを実行する方法を探しています 質問する

画像に対してビット単位のXORを実行する方法を探しています 質問する

私は入手方法を探していますビット単位の排他的論理和コマンドラインで 2 つのイメージを (またはプログラムやスクリプトで実装できる別の方法で) 実行します。

これにより、XOR ブレンド モードをサポートする画像エディタ (Paint.NET、Photoshop など) で XOR ブレンド モードを使用した場合と同じ最終画像が得られるはずです。

例えば、私が画像A:

画像 A (シアトル、Paint.NET ドキュメントより)

そして画像B:

ImageB (paint.net ドキュメントのリンゴ)

結果は次のようになります。

画像 C (上記画像の XOR 結果、Paint.NET ドキュメントより)

もちろん、これの面白いところは、イメージ 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、、img2img_outそれぞれ 2 つの入力ファイル名と 1 つの出力ファイル名です)。

説明

ちょっと見苦しいですが (私よりも ImageMagick に精通した人ならきれいにできると思いますが)、次のように動作します:

  1. -fx "xxx"xxx基本的には「画像に対して操作を実行する」という意味です。上記の式では、uと はvそれぞれ最初の入力画像と 2 番目の入力画像を表します。

  2. 現在、ビット演算子としては-fxビットAND&とビットORのみがあります。ビットXORを再構築するには、|

    convert img1 img2 -fx "(u & NOT v) | (NOT u & v)" img_out
    
  3. NOT(論理演算はあるNOTがビット演算はないNOT)を取得するには、次のことを覚えておく必要がある。NOT x = 255-x もし xは 8 ビットです。したがって、 を取得するには、画像が 8 ビットであると仮定して、NOT uを実行するだけです。したがって、ImageMagick コマンドは次のようになります。255-uu

    convert img1.png img2.img -fx "((255-u)&v)|(u&(255-v))" image_xor.png
    
    • ここでの 1 つの問題は、ImageMagick が、期待どおりではなく範囲内のfxすべてのピクセルを正規化し、非整数に対してビット単位で処理すると、問題が発生してしまうことです。uv[0,1][0,255]

    • したがって、私たちは掛け算をしなければなりません全てu上記の式内のとの出現回数をv255 で割って (ビット演算が機能する)、最後に 255 で割って[0,1]ImageMagick が想定する範囲に戻します。

これにより、元のコマンドは次のようになります。

convert img1 img2 -fx "(((255*u)&(255*(1-v)))|((255*(1-u))&(255*v)))/255" img_out

出来上がり!

おすすめ記事