2011-12-09 21 views
1

在GIMP UI中,有一個應用閾值功能(GIMP 2.6),它具有一個名爲Auto的選項。這會自動爲圖像計算適當的下限閾值。該功能/選項是否可用於插件? gimp-threshold和gimp-histogram函數似乎沒有這個選項。gimp腳本中的自動閾值功能-fu

回答

2

這是我最終使用的解決方案。僅適用於灰度圖像。其相同的算法作爲gimp_histogram_get_threshold功能gimphistogram.c

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

正是我在找的,謝謝。我必須將get-hist的chan參數更改爲5,即GIMP_HISTOGRAM_RGB以使其與UI中調用的值相匹配。 –

0

不幸的是,從GIMP版本2.6開始,此功能不會暴露給程序數據庫(API),因此無法在腳本-fu或Python腳本中使用。

+0

是的,我來到了同樣的結論。但我搜索了GIMP源代碼,並在gimphistogram.c中看到了這個函數gimp_histogram_get_threshold,這看起來可以做到這一切。我試圖將該算法轉換爲腳本。但是,對Scheme的不熟悉會讓我放慢腳步。儘快嘗試併發布解決方案。 – aldrin

+0

我最近查找了這個函數,並決定不要試圖在script-fu中實現它。我將它留給用戶,將自動按鈕從閾值對話框計算的值複製到腳本的參數對話框中,嘆息一聲。如果你想出可用的代碼,我肯定我不是唯一可以使用它的人。最佳閾值是一種基本的圖像處理技術。 – mgkrebbs

+0

@aldrin:我以前實際上已經在PDB中添加了一些缺失的條目 - 感謝您的研究 - 可能很難及時將其添加到GIMP 2.8中(應該在幾周內完成) – jsbueno