2

具体的には、特定の画像で、各ピクセルのRGB値を100ずつ減らしようとしています。

たとえば、ピクセルのR:232、G:40、B:120の場合、新しいRGB値をR:132、G:0、B:20にします。

私はImageMagickフォーラムで見つけたこのソリューションを試しました:

convert input.jpg -channel R -evaluate subtract 25700 \
-channel G -evaluate subtract 25700 \
-channel B -evaluate subtract 25700 output.jpg

編集:私が25700を使用する理由は、明らかにrgb値に257を掛ける必要があるためです。100* 257=25700。

最初は機能しているように見えますが(画像が明らかに暗くなります)、特定のピクセルは変更されないようです。私が行っていることは、変更することが重要です(結果の画像をトリミングして、トリミングしようとしています)。ピクセル値が0の境界線)。

一般的な問題は、RGB値が3、0、0のピクセルになってしまうことですが、そのピクセルのRGB値を0にして、減算する定数を-だけ増やしたいと思いますが、そうではありません。うまくいかないようです。

何か案は?ありがとう!

4

2 に答える 2

4

25700正直なところ、コマンドラインの値が何を達成する必要があるのか​​、私にはよくわかりません。

ただし、より強力な-fx演算子を使用して、別のコマンドラインを使用することをお勧めします。見た目はもう少し複雑ですが、うまくいけばもっと直感的に理解できます...

しかし、最初に、私はあなたの説明を見ていて120、現在のR、G、およびBの色の値のそれぞれから固定数を減算したいと思っていることがわかります。つまり、これは灰色のピクセルカラーです...そしてImageMagickのカラー組み込みカラーリストで調べることができるように、その名前はgray47次のとおりです。

convert -list color | grep '(120,120,120)'
  gray47                srgb(120,120,120)                             X11 XPM 
  grey47                srgb(120,120,120)                             SVG X11 

これにより、次のコマンドが表示されます。

   convert \
       input.jpg \
      -channel red   -fx 'r - gray47' \
      -channel green -fx 'g - gray47' \
      -channel blue  -fx 'b - gray47' \
       output.jpg

このように、またはコマンドを作成すると、将来必要になった場合に、簡単に導き出せる変更に目を向けることができます...

結果のポップアップウィンドウを(ファイルに書き込まずに)すぐにプレビューするには-show:、次のように出力として使用することもできます。

   convert \
       input.jpg \
      -channel red   -fx 'r - gray47' \
      -channel green -fx 'g - gray47' \
      -channel blue  -fx 'b - gray47' \
      -show:

アップデート

各ピクセルの実際の違いを確認したい場合は、ImageMagickに各ピクセルのカラー値を出力させることができます。

convert  input.jpg   input.txt
convert  output.jpg  output.txt

.txtファイルの形式は、最初の列がPixelにゼロベースの座標を与えることがわかっていれば、非常に理解しやすいものです。つまり、123,456:124番目(!)の列、457番目()の行を意味します。

これで、Gimpに頼る必要なしに、自動化されたスクリプトバージョンでも2つの.txtファイルを心ゆくまで比較できます。:-)

input.txtPerl、Ruby、Python、またはShellscriptを使用して各ピクセル値に適用し、各チャネルから値をそらし、output2.txt120として保存してから、JPEGに変換することもできます。

convert  output2.txt  output2.jpg

次に、2つの出力画像間のピクセルの違いを探します。

compare  output.jpg  output2.jpg  delta.jpg
compare  output.jpg  output2.jpg  view:

真っ白な平面は「違いがない」ことを意味し、赤いピクセルはある種のデルタを示唆します。

今、その答えが私に賛成票を獲得しない場合、私はどちらがそうなるかわかりません... :-)

于 2012-08-07T19:00:01.033 に答える
1

ケン、いや、大きなパーサーを書く必要はありません。いくつかのシェルコマンドで非常に簡単に実行できます。最初にそれらをテストしてから、シェルまたはバッチスクリプトに入れます。このようなもの(Bashスクリプトとして):

#!/ bin / bash

echo "注意:このスクリプトは完了するまでにかなりの時間がかかる場合があります..."
echo "(このスクリプトは、アルファチャネルを使用してPNGファイルを変換するために作成されています。"
echo "他のタイプの画像の場合は、少し変更する必要があります。)"
エコー
echo "このスクリプトは、8ビットのRGBA入力画像を取得し、より暗い出力画像を作成します。"
echo "その方法は、各カラーチャネルの数値から100の値を引くことです。"
エコー

input = "$ {1}"

_im_header = $(identify -format "%W、%H" "$ {input}")

echo "#ImageMagickピクセル列挙:$ {_ im_header}、255、rgba"> input-minus-120.txt

「${input}」input.txtを変換します

cat input.txt \
   | \
     sed's#)。* $#)#; s### g; s#:#:#; s#(##; s#)##; s#、##g; s ##、#'\
   | \
     コーディネイトレッドグリーンブルーアルファを読みながら; 行う
        echo -n "$ {coord}";
        echo -n "(";
        echo -n "$(($ red-100))、";
        echo -n "$(($ green-100))、";
        echo -n "$(($ blue-100))、";
        echo -n "$(($ alpha))";
        echo -n ")";
        エコー;
     終わり \
   | sed's#-[0-9] *#0#g' \
>> input-minus-120.txt

input-minus-120.txtを変換するoutput-minus-120.jpg

このスクリプトは、MacBook Proで実行するのに153秒かかり、750キロバイトの1080x889ピクセルのPNGファイルを処理しました。

生成されたinput.txtには960120行(PNGのピクセル数)が含まれていました。

したがって、このブルートフォースシェルスクリプトのパフォーマンスは約6275ピクセル/秒です。

于 2012-08-08T20:32:49.917 に答える