2011-12-09 12 views
1

GIMP UIには、自動と呼ばれるオプションを持つApply Threshold機能(GIMP 2.6)があります。これにより、画像の適切な下限しきい値が自動的に計算されます。この関数/オプションはプラグインで使用できるのですか? gimp-thresholdとgimp-histogram関数はこのオプションを持たないようです。gimpスクリプトの自動しきい値機能

答えて

2

ここで私が最後に使用したソリューションです。グレースケール画像でのみ動作します。 gimphistogram.cでgimp_histogram_get_threshold機能のように、その同じアルゴリズム

http://git.gnome.org/browse/gimp/tree/app/base/gimphistogram.c

(define (auto-threshold imagePath) 
    (let* 
     (
      (theImage (car (gimp-file-load 
            RUN-NONINTERACTIVE 
            imagePath 
            imagePath 
          ) 
        ) 
      ) 

      (theDrawable (car (gimp-image-get-active-drawable theImage))) 
      (hist (get-hist theDrawable 0)) 
     ) 
     (get-auto-threshold hist) 
    ) 
) 

;returns the threshold 
(define (get-auto-threshold hist) 
    (let* 
     (
      (hist_max (vector-ref hist 0)) 
      (chist (make-vector 256)) 
      (cmom (make-vector 256)) 
      (maxval 255) ;end - start 
      (i 1) 
      (tmp) 
      (chist_max) 
      (cmom_max) 
      (bvar_max 0) 
      (threshold 127) 
     ) 

     (vector-set! chist 0 (vector-ref hist 0)) 
     (vector-set! cmom 0 0) 

     (set! i 1) 
     (while (<= i maxval) 
      (if (> (vector-ref hist i) hist_max) 
       (set! hist_max (vector-ref hist i)) 
      ) 
      (vector-set! chist i (+ (vector-ref chist (- i 1)) (vector-ref hist i))) 
      (vector-set! cmom i (+ (vector-ref cmom (- i 1)) (* i (vector-ref hist i)))) 
      (set! i (+ i 1)) 
     ) 

     (set! chist_max (vector-ref chist maxval)) 
     (set! cmom_max (vector-ref cmom maxval)) 

     (set! i 0)  
     (while (< i maxval) 
     (if (and (> (vector-ref chist i) 0) (< (vector-ref chist i) chist_max)) 
      (let* 
       ((bvar (/ (vector-ref cmom i) (vector-ref chist i)))) 

       (set! bvar (- bvar (/ (- cmom_max (vector-ref cmom i)) (- chist_max (vector-ref chist i))))) 
       (set! bvar (* bvar bvar)) 
       (set! bvar (* bvar (vector-ref chist i))) 
       (set! bvar (* bvar (- chist_max (vector-ref chist i)))) 

       (if (> bvar bvar_max) 
        (begin 
        (set! threshold i) 
        (set! bvar_max bvar) 
       ) 
       ) 

      ) 
     ) 
     (set! i (+ i 1)) 
    ) 

    threshold 
) 


) 

;returns the raw histogram with values 0-1 as an array 
(define (get-hist drawable chan) 
(let* (
(i 0) 
(hist (make-vector 256)) 
) 
(set! i 0) 
(while (< i 256) 
(vector-set! hist i (car (cddddr (gimp-histogram drawable chan i i)))) 
(set! i (+ i 1)) 
) 
hist 
) 
) 
+0

ちょうど私が探していたもの、ありがとう。 GIMP_HISTOGRAM_RGBであるget-histのchanパラメータをUIから呼び出された値に一致させるために変更する必要がありました。 –

0

残念ながら、GIMPバージョン2.6では、この機能はProcedural Database(API)に公開されていないため、script-fuスクリプトやPythonスクリプトでは使用できません。

+0

はい、私は同じ結論に達しました。しかし、私はGIMPのソースコードを検索し、gimphistogram.cのこの関数gimp_histogram_get_thresholdに遭遇しました。これはすべての魔法を行うようです。私はそのアルゴリズムをscript-fuに変換しようとしています。しかし、Schemeに慣れていないので、私は遅くなっています。できるだけ早くこれを解決しようとします。 – aldrin

+0

私はこの機能を最近探して、script-fuで実装しようとしないことにしました。自動ボタンがしきい値ダイアログから計算した値をスクリプトのパラメータダイアログ(sigh)にコピーするようにユーザに残しました。使用可能なコードを考え出すなら、私はそれを利用できる唯一の人ではないと確信しています。最適な閾値処理は、基本的な画像操作技術である。 – mgkrebbs

+0

@アルドリン:私は実際にPDBにいくつかの不足しているエントリを追加していました - あなたの研究に感謝します - それはGIMP 2.8(数週間後に出てくるはずです)の時代であるかもしれません – jsbueno

関連する問題