1

image-mapを使用して範囲に応じて画像の色を変更する手順を作成しようとしています。このような:

If the sum of the RGB channels for one pixel = 0 to 181 then the color would be (0 51 76)
If the sum = 182 to 363 then the color would be (217 26 33)
If the sum = 364 to 545 then the color would be (112 150 158)
If the sum = 546 to 765 then the color would be (252 227 166)

さて、これが私がこれまでに持っているものです:

(define (sum p)
  (image-map
   (lambda (c)
    (+ (color-ref c 'red) (color-ref c 'green) (color-ref c 'blue)))
   p))

(define color-range
  (lambda (c)
    (cond
      [(< (sum c) 181) (color 0 51 76)]
      [(and (>= (sum c) 182) (<= (sum c) 363)) (color 217 26 33)]
      [(and (>= (sum c) 364) (<= (sum c) 545)) (color 112 150 158)]
      [(and (>= (sum c) 546) (<= (sum c) 765)) (color 252 227 166)])))

そこで、各ピクセルの合計を計算するヘルパー関数を作成しました。color-rangeを実行すると、次のようなエラーが発生します。

画像マップの例外:#[color 255 255 255]は正しいタイプではなく、予想される画像です

ヘルプ?

ありがとう!

4

2 に答える 2

0

あなたは画像と色を混同しています(あなたは色で呼んsumでいますがsum、画像を期待しているようです)。タイプをより明確にします。例えば:

(define (color-intensity c)
  (+ (color-ref c 'red) (color-ref c 'green) (color-ref c 'blue)))

(define (remap-color c)
  (let ((intensity (color-intensity c)))
    (cond [(<=   0 intensity 181) ...]
          [(<= 182 intensity 363) ...]
          ...)))

(define (remap-image i)
  (image-map remap-color i))
于 2013-03-06T17:23:36.910 に答える
0

sum、ピクセルまたは画像の予想される入力は何ですか?ピクセルの場合、なぜそれを使用してトラバースするのimage-mapですか?画像の場合、すべてのピクセルのすべてのカラーコンポーネントを追加し、それを新しいピクセルとして設定するのはなぜですか?

これはあなたが意図したものに近いと思います(現在質問にあるコードの抜粋だけでははっきりとはわかりません)。また、次のいくつかのバグを修正したことにも注意してcolor-rangeください。

(define sum
  (lambda (c)
    (+ (color-ref c 'red)
       (color-ref c 'green)
       (color-ref c 'blue))))

(define color-range
  (lambda (c)
    (cond
      [(<= 0   (sum c) 181) (color 0 51 76)]
      [(<= 182 (sum c) 363) (color 217 26 33)]
      [(<= 364 (sum c) 545) (color 112 150 158)]
      [else                 (color 252 227 166)])))

(define change-colors
  (lambda (image)
    (image-map (lambda (pixel)
                 (color-range pixel))
               image)))

もちろん、上記はさらに最適化できます(たとえば、への複数の呼び出しを削除し、に直接sum渡すなど)が、最初に、上記が機能し、それが何をしているのかを理解していることを確認しましょう。color-rangeimage-map

于 2013-03-06T19:05:46.040 に答える