2011-12-09 91 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