我一直在與我的班級特殊圖像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)))
「以浮雕圖像,每個像素的顏色從原始圖像中的像素相鄰的6計算的。通過在添加三個像素的相應的組件獲得了壓花像素的每個顏色分量直接在它上面的行,並從它下面的行中的三個像素中減去這些分量,然後對結果施加提升。「
我試圖創建圖像刻印:它需要的圖像,並返回圖像的壓紋版。周邊像素不變。這個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)))))
生成圖像需要行,列和過程。
(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)))))
我測試的方法就是通過dloading的圖像,並在REPL定義它,然後繪製使用我的教授創建的過程圖像。
反正。我認爲我的代碼接近正確,但我真的不知道如何糾正它。如果任何人有一個提示/更好的解釋,這將幫助我解決這個問題,我真的很感激。謝謝
這實際上也幫助了我很多。我沒有使用過多的圖像處理程序,所以我對這個問題感到失望。回想起SO上的舊帖子是非常有趣的,實現了你在一兩週內實際學到了多少程序設計。 – mdegges 2011-05-04 22:59:08
無論如何,我應該做的是定義了兩個循環,r和c,分別爲(sub1(image-rows image))和(sub1(image-cols image))。然後,當r和c>> 0時,繼續在每次迭代中通過r和c壓印圖像和sub1。 – mdegges 2011-05-04 23:04:46