module SsimSort
Public Class Methods
cov(x,y)
click to toggle source
# File lib/ssimsort.rb, line 14 def SsimSort.cov(x,y) return x.zip(y).covariance end
get_lum(img,px=80)
click to toggle source
# File lib/ssimsort.rb, line 19 def SsimSort.get_lum(img,px=80) img = img.scale(px,px) lum_average = img.get_pixels(0, 0, img.columns, img.rows).map do |p| p.to_HSL[2] end return lum_average end
sort(input_path,output_path,tolerance=0.8)
click to toggle source
# File lib/ssimsort.rb, line 58 def SsimSort.sort(input_path,output_path,tolerance=0.8) files = Dir.entries(input_path).map {|file| File.absolute_path("#{input_path}/#{file}")} files.shift(2) #Remove . and .. files.select!{|f| @formats=~ f} set = files.product(files) set.each do |file1,file2| path = "#{output_path}/#{file1.split("/").last}/" simil = SsimSort.ssim(file1,file2) if simil > tolerance FileUtils.makedirs(path) unless File.exists?(path) FileUtils.cp(file2,path) end end end
sort_comp(filecomp_path,input_path,output_path)
click to toggle source
# File lib/ssimsort.rb, line 73 def SsimSort.sort_comp(filecomp_path,input_path,output_path) filecomp = File.absolute_path(filecomp_path) output_path = File.absolute_path(output_path+"/") files = Dir.entries(input_path).map {|file| File.absolute_path("#{input_path}/#{file}")} files.shift(2) #Remove . and .. files.select!{|f| @formats=~ f} sim_dict = {} FileUtils.mkdir(output_path) unless File.exists?(output_path) files.each do |file| simil = SsimSort.ssim(filecomp,file) sim_dict[file] = simil end sim_list = sim_dict.sort_by {|k,v| v}.reverse sim_list.each_with_index do |k,i| FileUtils.cp(k[0],"#{output_path}/#{i}(#{k[1]})#{File.extname(k[0])}") end end
ssim(file1,file2)
click to toggle source
# File lib/ssimsort.rb, line 28 def SsimSort.ssim(file1,file2) cA,cB = 0.01, 0.03 x,y = get_lum(ImageList.new(file1)), get_lum(ImageList.new(file2)) var_x, var_y = x.variance, y.variance moy_x, moy_y = x.mean, y.mean a = (2*moy_x*moy_y+cA)*(2*(cov(x,y))+cB) b = (moy_x**2+moy_y**2+cA)*(var_x+var_y+cB) (a/b) < 0 ? 0 : (a/b).round(5) end
ssim_dir(input_path)
click to toggle source
# File lib/ssimsort.rb, line 39 def SsimSort.ssim_dir(input_path) files = Dir.entries(input_path).map {|file| File.absolute_path("#{input_path}/#{file}")} files.shift(2) #Remove . and .. files.select!{|f| @formats=~ f} set = files.product(files) set.each do |file1,file2| simil = SsimSort.ssim(file1,file2) puts "#{file1.split("/").last}\t|\t#{simil}\t|\t#{file2.split("/").last}" end end
ssim_dir_mean(input_path)
click to toggle source
# File lib/ssimsort.rb, line 50 def SsimSort.ssim_dir_mean(input_path) files = Dir.entries(input_path).map {|file| File.absolute_path("#{input_path}/#{file}")} files.shift(2) #Remove . and .. files.select!{|f| @formats=~ f} set = files.combination(2).to_a l = set.map {|file1,file2| SsimSort.ssim(file1,file2)}.mean end