我一直在用我的班级'特殊形象ADT进行图像浮雕程序,但我似乎无法弄明白。我已经包含了我最近编辑的代码和我一直用于解决问题的图像程序。如果您有几分钟的时间来完成解释,您可能会发现这种类型的图像编辑很有趣。
(define bound
(lambda (n)
(cond
[(<= n 0) 0]
[(>= n 255) 255]
[else n])))
Bound采用整数并将0到255范围之外的值裁剪到端点。
(define boost
(lambda (x)
(bound (+ 127 x))))
Boost取一个整数,加上127,然后绑定结果。数字127是提升的焦点,因为我们将使用增强来增强颜色,127是颜色分量范围的一半。
(define image-emboss
(lambda (img)
(define emboss
(lambda (r c)
(let ([a (image-ref img r (add1 c))]
[b (image-ref img (add1 r) (add1 c))]
[c (image-ref img (sub1r) (add1 c))]
[d (image-ref img r (sub1 c))]
[e (image-ref img (sub1 r) (sub1 c))]
[f (image-ref img (add1 r) (sub1 c))])
(if (or (< r 0) (< c 0))
img
(make-image r c (boost (- (+ a b c) d e f)))))))
(emboss r c)))
“在浮雕图像中,每个像素的颜色是根据原始图像中的六个邻近像素计算的。浮雕像素的每个颜色分量是通过在上面的行中添加三个像素的相应分量来获得的。然后从它下面的行中的三个像素中减去组件,然后对结果应用boost。“
我尝试创建图像浮雕:它会拍摄图像并返回图像的浮雕版本。沿周边的像素不变。这个proc应该使用make-image和image-ref。
图像行采用图像并返回图像中的行数。
(define image-rows
(lambda (img)
(cond
[(image? img 1 1) (vector-length (img))]
[else
(error 'image-rows (format "~a is not an image" img))])))
Image-cols拍摄图像并返回图像中的列数。
(define image-cols
(lambda (img)
(cond
[(image? img 1 1) (if (zero? (vector-length (img)))
0
(vector-length (vector-ref (img) 0)))]
[else
(error 'image-cols (format "~a is not an image" img))])))
Image-ref接受图像,行索引和列索引,并返回像素。
(define image-ref
(lambda (img r c)
(if (not (image? img 0 0))
(error 'image-ref "first argument is not an image"))
(if (and (integer? r) (<= 0 r (- (image-rows img) 1)))
(if (and (integer? c) (<= 0 c (- (image-cols img) 1)))
(vector-ref (vector-ref (img) r) c)
(error 'image-ref (format "~a is an illegal index" c)))
(error 'image-ref (format "~a is an illegal index" r)))))
Make-image采用行,列和过程。
(define make-image
(lambda (rows cols . args)
(let ([gen-proc
(cond
[(null? args) (lambda (i j rows cols) black)]
[(not (null? (cdr args)))
(error 'make-image "too many arguments")]
[(color? (car args)) (lambda (i j rows cols) (car args))]
[(procedure? (car args)) (car args)]
[else (error 'make-image (format "unknown fill: ~s"
(car args)))])])
(let ([img (make-vector rows)])
(let loop ([i 0])
(when (< i rows)
(vector-set! img i
(let ([row (make-vector cols)])
(let loop ([j 0])
(when (< j cols)
(vector-set! row j (gen-proc i j rows cols))
(loop (+ j 1))))
row))
(loop (+ i 1))))
(lambda () img)))))
我测试它的方法是通过在repl中加载图像并定义它,然后使用我的教授创建的过程绘制图像。
反正。我认为我的代码接近正确,但我真的不确定如何纠正它。如果有人有一个暗示/更好的解释,将帮助我解决这个问题,我真的很感激。感谢
答案 0 :(得分:1)
虽然我不确定你看到了哪些其他问题,但有一件事让我感到震惊:image-emboss
功能目前似乎没有正确的评估流程。从我看到的,当你调用image-emboss
时,你传递一个图像,此时它会评估lambda,它评估emboss
的lambda,然后用值调用emboss
r
和c
...但您尚未在环境中定义r
和c
(即image-emboss
lambda创建的环境框架)emboss
正在调用内部。然后,方案解释器如何评估两个符号r
和c
以正确调用emboss
定义的lambda?
我认为至少您对emboss
内image-emboss
的调用应该更像(emboss (image-rows img) (image-cols img))
而不是(emboss r c)
。调用(emboss (image-rows img) (image-cols img))
的符号可以在image-emboss
定义的环境框架中进行评估...另一方面(emboss r c)
不会。
我不确定你有什么其他问题,因为你没有描述你得到的任何实际错误,或者如果它们被破坏了结果可能会是什么样子。但同样,我会说我所描述的代码错误至少是使用image-emboss
函数时必须遇到的一个主要问题。
希望这有帮助,
杰森