2011-04-22 19 views
2

我一直在與我的班級特殊圖像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計算的。通過在添加三個像素的相應的組件獲得了壓花像素的每個顏色分量直接在它上面的行,並從它下面的行中的三個像素中減去這些分量,然後對結果施加提升。「

Image of pixels needed

我試圖創建圖像刻印:它需要的圖像,並返回圖像的壓紋版。周邊像素不變。這個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定義它,然後繪製使用我的教授創建的過程圖像。

反正。我認爲我的代碼接近正確,但我真的不知道如何糾正它。如果任何人有一個提示/更好的解釋,這將幫助我解決這個問題,我真的很感激。謝謝

回答

1

雖然我不確定你看到了什麼其他問題,但有一點讓我不高興的是image-emboss函數似乎沒有正確的評估流程。從我看到的情況來看,當你打電話給image-emboss時,你會傳遞一張圖片,此時它會評估評估lambda的lambda值爲emboss,然後調用emboss的值爲rc ...但您尚未定義rcemboss正在調用的環境中(即由image-emboss lambda創建的環境框架)。那麼計劃翻譯人員如何評估這兩個符號rc以便正確調用由emboss定義的lambda?

我會認爲你至少撥打embossimage-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函數時必須遇到的一個主要問題。

希望這有助於

傑森

+0

這實際上也幫助了我很多。我沒有使用過多的圖像處理程序,所以我對這個問題感到失望。回想起SO上的舊帖子是非常有趣的,實現了你在一兩週內實際學到了多少程序設計。 – mdegges 2011-05-04 22:59:08

+0

無論如何,我應該做的是定義了兩個循環,r和c,分別爲(sub1(image-rows image))和(sub1(image-cols image))。然後,當r和c>> 0時,繼續在每次迭代中通過r和c壓印圖像和sub1。 – mdegges 2011-05-04 23:04:46