2016-09-07 6 views
0

画像ファイルに画像のある青色のピクセルが含まれているかどうかをチェックし、それらを数えてから結果を保存するかどうかをチェックするコードを取得しました。ImagemagickプロセスがLoopbackjsで永久にハングする

これはうまくいきますが、Imagemagickの多くのプロセスが永遠にサーバーに停止しているように見えて、非常に遅くなっているようです。

このコードを改善し、このトラブルを回避する方法はありますか?

module.exports = function (File) { 
    File.observe('after save', function countPixels(ctx, next) { 
     if (ctx.instance && !ctx.instance.blue_pixels) { 
      var exec = require('child_process').exec; 

      // Convert file to retrieve only blue pixels: 
      exec('convert ' + ctx.instance.path + ' -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" -format "%[fx:mean*w*h]" info:', 
        function (error, stdout, stderr) { 
         if (error !== null) { 
          return next(error); 
         } else { 
          ctx.instance.blue_pixels = stdout; 
          File.upsert(ctx.instance); 
         } 
        }); 
     } 
     next(); 
    }); 
}; 

答えて

1

使用している-fxオペレータは、悪名高い遅いです - 特に大規模なイメージに。私はあなたに役立つかもしれないより速い方法を使って同じ公式をキャストしようとしました。

convert xc:red xc:lime -append \(xc:blue xc:cyan -append \) +append -resize 256x256! input.png 

enter image description here

そして、このようなあなたの式を書き直し::だから、私は、サンプル画像を作っ-write XYZ.pngを除去することができるだけでデバッグ文であることを

convert input.png \ 
    \(-clone 0 -separate -delete 0 -evaluate-sequence subtract -threshold 20% -write BG.png \) \ 
    \(-clone 0 -separate -delete 1 -evaluate-sequence subtract -threshold 20% -write BR.png \) \ 
    \(-clone 0 -colorspace hsl -separate -delete 0,2 -threshold 60% -write S.png \)   \ 
    -delete 0 \ 
    -evaluate-sequence min result.png 

注意。

基本的には、条件を満たすすべてのピクセルのマスクを作成して白くし、基準に合致しないものをすべて黒にして、最後に-evaluate-sequence minを実行して各ピクセルの最小値を求めますあなたの条件のすべての3つが有効満たされなければならないように、画素は:

  • 青20%緑超えている青が20%飽和を超えること
  • 60%赤色超える

-separate -delete Nは、画像をRGBチャンネルに分割し、結果のチャンネルの1つを削除します。したがって、-delete 1(緑色のチャンネル)の場合は、赤と青が残ります。ここに、中間のデバッグイメージがあります。一つ目は青が20%で赤を超える条件である:

enter image description here

その後ブルーは20%でグリーンを超えていること:彩度は60%を超えていることを

enter image description here

そして最後に:

enter image description here

結果:

enter image description here

あなたが飽和した青色の画素の数を取得するには、出力画像名の代わりに最後に戻ってあなた-format "%[fx:mean*w*h]" info:を配置する必要があります。

私はあなたのコマンドを実行した場合:

convert input.png -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" result.png 

enter image description here

私の脳は、今日非常に適切ではないので、いくつかのチェックを実行してください - 私はどこかに後ろから前に何かを持っていることは!

ベンチマークとして、10,000×10,000ピクセルのPNGでは、コードは30秒で実行されますが、-fxには約7分かかります。

+0

素晴らしい!素晴らしい仕事をしてくれました。すばやく答えを求めてくれてありがとう。 – F3L1X79

1

私はimagelagickの部分を知らない。しかし、ノード部分については、imagemgickの操作に関して次の非コールを参照することがわかります。

module.exports = function (File) { 
    File.observe('after save', function countPixels(ctx, next) { 
     if (ctx.instance && !ctx.instance.blue_pixels) { 
      var exec = require('child_process').exec; 

      // Convert file to retrieve only blue pixels: 
      exec('convert ' + ctx.instance.path + ' -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" -format "%[fx:mean*w*h]" info:', 
        function (error, stdout, stderr) { 
         if (error !== null) { 
          return next(error); 
         } else { 
          ctx.instance.blue_pixels = stdout; 
          File.upsert(ctx.instance); 
          next(); 
         } 
        }); 
     } 
     else{next();} 
     //next(); //run next hook ASAP (before imagemagick returns back the result) 
    }); 
}; 
+0

私は考えていました、それが固まった場合にchild_processが殺されていることを確認する方法がありますか? – F3L1X79

+0

@ F3L1X79タイムアウト後に強制終了できます。 'exec'メソッドは' kill'メソッドを持つ子プロセスインスタンスを返します。 https://nodejs.org/api/child_process.html#child_process_child_kill_signal –

関連する問題