1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| require 'RMagick'
include Magick
#Sanity check to make sure we have a filename
if ARGV.length < 1
puts "Filename needed"
exit
end
#Read the input image and get its pixels
#Array contains three entries for pixel, red then green then blue
image_filename = ARGV.first
img_orig = Image.read(image_filename).first
pixels = img_orig.export_pixels
r = Array.new(img_orig.rows, Array.new(img_orig.columns,Float(0)))
g = Array.new(img_orig.rows, Array.new(img_orig.columns,Float(0)))
b = Array.new(img_orig.rows, Array.new(img_orig.columns,Float(0)))
avg_distance = Array.new(img_orig.rows, Array.new(img_orig.columns,Float(0)))
print "start ", image_filename, " ", Time.new, "\n"
0.upto(img_orig.rows - 1) do |i|
0.upto(img_orig.columns - 1) do |j|
red_location = 3 * (i * img_orig.columns + j) #0 at (0,0), 3 at (0,1)
r[i][j] = pixels[red_location]
g[i][j] = pixels[red_location + 1]
b[i][j] = pixels[red_location + 2]
# normalize rgb to unit vector
vector_length = Math.sqrt(r[i][j] ** 2 + g[i][j] ** 2 + b[i][j] ** 2)
r[i][j] = r[i][j] / vector_length
b[i][j] = b[i][j] / vector_length
g[i][j] = g[i][j] / vector_length
end
end
output_filename = ARGV.first + ".txt"
outfile = open(output_filename, "w")
(2).upto((img_orig.rows) - 3) do |x0|
(2).upto((img_orig.columns) -3) do |y0|
(x0-2).upto(x0+2) do |x|
(y0-2).upto(y0+2) do |y|
avg_distance[x0][y0] = avg_distance[x0][y0] + Math.sqrt( (r[x][y] - r[x0][y0]) **2 + (g[x][y] - g[x0][y0]) **2 + (b[x][y] - b[x0][y0]) **2 )
end
end
avg_distance [x0][y0] = avg_distance[x0][y0] / 25
outfile.print(image_filename, ",", x0, ",", y0, ",", avg_distance[x0][y0], "\n")
end
end
outfile.close
print "end ", Time.new, "\n" |
Partager