Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在gimp中有没有找到图层上点的方法?_Gimp_Script Fu_Python Fu - Fatal编程技术网

在gimp中有没有找到图层上点的方法?

在gimp中有没有找到图层上点的方法?,gimp,script-fu,python-fu,Gimp,Script Fu,Python Fu,假设我有一个带有几个点的图像(如附件所示)。脚本有没有办法找到这些点,然后给我一个数组 我想我可以通过图像处理做到这一点,但我希望有一个脚本可以做到这一点。 我认为在脚本中这样做不是一个好主意。使用脚本Fu在像素上迭代非常慢,因为它需要为每个像素分配一个数组和一个列表 我已经很快编写了脚本来完成这项工作,但速度非常慢-在我的机器上拍摄您的图像需要大约5分钟的时间: ; Returns an array of cons pairs (define (count-points image) (l

假设我有一个带有几个点的图像(如附件所示)。脚本有没有办法找到这些点,然后给我一个数组

我想我可以通过图像处理做到这一点,但我希望有一个脚本可以做到这一点。
我认为在脚本中这样做不是一个好主意。使用脚本Fu在像素上迭代非常慢,因为它需要为每个像素分配一个数组和一个列表

我已经很快编写了脚本来完成这项工作,但速度非常慢-在我的机器上拍摄您的图像需要大约5分钟的时间:

; Returns an array of cons pairs
(define (count-points image)
  (let* ((duplicate (car (gimp-image-duplicate image)))
     (layer (car (gimp-image-flatten duplicate)))
     (width (car (gimp-image-width duplicate)))
     (heigth (car (gimp-image-height duplicate))))
    (display (gimp-drawable-is-gray layer)) (newline)
    (if (not (equal? (car (gimp-drawable-is-gray layer)) 1))
      (gimp-image-convert-grayscale duplicate))
    (plug-in-blur 0 duplicate layer)
    (gimp-threshold layer 0 127)
    (let loop ((x 0) (y 0) (result '()))
      (if (>= y heigth)
      result
      (if (>= x width)
          (loop 0 (+ y 1) result)
          (loop (+ x 1)
            y
            (let ((vals (cadr (gimp-drawable-get-pixel layer x y))))
              (if (< (aref vals 0) 127)
              result
              (cons (cons x y) result)))))))))

;; Call in Script-Fu Console like this (to calculate points
;; of the last image opened/created):
;; 
;;   (let ((imgs (gimp-image-list)))
;;     (count-points (vector-ref (cadr imgs) 0)))
;返回cons对的数组
(定义(计数点图像)
(let*((复制(汽车(gimp图像复制图像)))
(图层(car(gimp图像展平复制)))
(宽度(汽车(gimp图像宽度复制)))
(高度(汽车(gimp图像高度复制)))
(显示(gimp可绘制为灰色层))(换行)
(如果(不相等?(car(gimp可拉伸为灰色层))1)
(gimp图像转换灰度复制)
(插入模糊0复制层)
(gimp阈值层0 127)
(let循环((x0)(y0)(结果“()))
(如果(>=y高度)
结果
(如果(>=x宽度)
(循环0(+y 1)结果)
(环路(+x1)
Y
(let((VAL(cadr(gimp可绘制获取像素层x y)))
(如果(<(aref VAL 0)127)
结果
(cons(cons x y)结果(()()()))(())()))
;; 像这样调用脚本Fu控制台(计算点数
;上次打开/创建的图像的名称):
;; 
;;   (let((imgs(gimp图像列表)))
;;;(计数点(矢量参考(cadr imgs)0)))

我建议将图像导出(模糊图像并在之前使用treschold)为PGB/PBM等哑格式,然后使用C或其他可编译语言的外部程序进行计算。

我认为在脚本中这样做不是一个好主意。使用脚本Fu在像素上迭代非常慢,因为它需要为每个像素分配一个数组和一个列表

我已经很快编写了脚本来完成这项工作,但速度非常慢-在我的机器上拍摄您的图像需要大约5分钟的时间:

; Returns an array of cons pairs
(define (count-points image)
  (let* ((duplicate (car (gimp-image-duplicate image)))
     (layer (car (gimp-image-flatten duplicate)))
     (width (car (gimp-image-width duplicate)))
     (heigth (car (gimp-image-height duplicate))))
    (display (gimp-drawable-is-gray layer)) (newline)
    (if (not (equal? (car (gimp-drawable-is-gray layer)) 1))
      (gimp-image-convert-grayscale duplicate))
    (plug-in-blur 0 duplicate layer)
    (gimp-threshold layer 0 127)
    (let loop ((x 0) (y 0) (result '()))
      (if (>= y heigth)
      result
      (if (>= x width)
          (loop 0 (+ y 1) result)
          (loop (+ x 1)
            y
            (let ((vals (cadr (gimp-drawable-get-pixel layer x y))))
              (if (< (aref vals 0) 127)
              result
              (cons (cons x y) result)))))))))

;; Call in Script-Fu Console like this (to calculate points
;; of the last image opened/created):
;; 
;;   (let ((imgs (gimp-image-list)))
;;     (count-points (vector-ref (cadr imgs) 0)))
;返回cons对的数组
(定义(计数点图像)
(let*((复制(汽车(gimp图像复制图像)))
(图层(car(gimp图像展平复制)))
(宽度(汽车(gimp图像宽度复制)))
(高度(汽车(gimp图像高度复制)))
(显示(gimp可绘制为灰色层))(换行)
(如果(不相等?(car(gimp可拉伸为灰色层))1)
(gimp图像转换灰度复制)
(插入模糊0复制层)
(gimp阈值层0 127)
(let循环((x0)(y0)(结果“()))
(如果(>=y高度)
结果
(如果(>=x宽度)
(循环0(+y 1)结果)
(环路(+x1)
Y
(let((VAL(cadr(gimp可绘制获取像素层x y)))
(如果(<(aref VAL 0)127)
结果
(cons(cons x y)结果(()()()))(())()))
;; 像这样调用脚本Fu控制台(计算点数
;上次打开/创建的图像的名称):
;; 
;;   (let((imgs(gimp图像列表)))
;;;(计数点(矢量参考(cadr imgs)0)))
我建议将图像导出(模糊图像并在之前使用treschold)为一些哑格式,如PGB/PBM,然后使用C或其他可编译语言的外部程序进行计算