Дело в том, что массив, который вы получаете от each_pixel, является новым набором данных.Данные должны быть сохранены обратно к изображению.
Используйте взамен get_pixels и store_pixels:
img = Magick::ImageList.new('img.jpg').first
pixels = img.get_pixels(0,0,img.columns,img.rows)
for pixel in pixels
avg = (pixel.red + pixel.green + pixel.blue) / 3
pixel.red = avg
pixel.blue = avg
pixel.green = avg
end
img.store_pixels(0,0, img.columns, img.rows, pixels)
img.display