2013-03-06 2 views
1

Я пытаюсь сделать процедуру, которая использует изображение-карту, чтобы изменить цвет изображения в соответствии с диапазоном. Как это:Изменение цвета изображения в соответствии с диапазонами?

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)]))) 

Итак, я сделал вспомогательную функцию для вычисления суммы каждого пикселя. Когда я бегу цветовой диапазон, я получаю ошибку о том, что:

Exception в изображении-карте: # [цвет 255 255 255] не правильный тип, ожидаемый образ

Помощь?

Спасибо!

ответ

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-range непосредственно image-map и т.д.) но во-первых, давайте удостовериться, что это работает и что вы понимаете, что он делает.

+0

Я думаю, что я пытаюсь получить пиксель на сумму, и это то, что вы сделали, не так ли? Итак, если я ищу пиксель, я не должен использовать карту изображения, потому что это возвращает изображение, верно? – 2013-03-07 02:20:37

+0

Правильно, и не забудьте проверить каждую процедуру помощника отдельно, прежде чем включать их в основную процедуру, которая реализует решение –

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)) 
Смежные вопросы