在 GIMP UI 中,有一个 Apply Threshold 功能 (GIMP 2.6),它有一个名为 Auto 的选项。这会自动为图像计算适当的较低阈值。此功能/选项是否可在插件中使用?gimp-threshold 和 gimp-histogram 函数似乎没有这个选项。
问问题
1725 次
2 回答
2
这是我最终使用的解决方案。仅适用于灰度图像。它与 gimp_histogram_get_threshold 函数中的算法相同 gimpistogram.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
)
)
于 2011-12-11T08:20:11.113 回答
0
不幸的是,从 GIMP 版本 2.6 开始,此功能未向过程数据库 (API) 公开,因此无法在 script-fu 或 Python 脚本中使用。
于 2011-12-09T15:20:30.233 回答