PageRenderTime 29ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 1ms

/histogram_analysis.py

https://bitbucket.org/wschurman/colorapp-analysis
Python | 97 lines | 71 code | 26 blank | 0 comment | 15 complexity | ddd5bfb9984b0245e45c5b5a1b7ef80a MD5 | raw file
  1. from PIL import Image
  2. import glob
  3. import os
  4. from plot_helper import PlotHelper
  5. class HistogramAnalysis:
  6. def __init__(self, image_dir, fname_stress, centroids=None):
  7. self.fname_stress = fname_stress
  8. self.image_dir = image_dir
  9. self.avg_hists = self.find_avg_histograms()
  10. self.plot_hists()
  11. def load_images(self):
  12. os.chdir(self.image_dir)
  13. for infile in glob.glob("*.jpg"):
  14. yield (infile, Image.open(infile))
  15. def bin_stress(self, stress, centroid=None):
  16. if not centroid is None:
  17. return "centroid" + str(centroid)
  18. if stress < 0.5:
  19. return "LOW"
  20. else:
  21. return "HIGH"
  22. def find_avg_histograms(self):
  23. res = dict()
  24. for (fname, img) in self.load_images():
  25. if fname in self.fname_stress:
  26. stress = self.fname_stress[fname]["stress"]
  27. centroid = self.fname_stress[fname]["centroid"]
  28. bin = self.bin_stress(stress, centroid)
  29. hist = img.histogram()
  30. if bin in res:
  31. res[bin].append(hist)
  32. else:
  33. res[bin] = [hist]
  34. comp = dict()
  35. def avg_hists(hists):
  36. sum_hist = None
  37. for hist in hists:
  38. if sum_hist:
  39. for i in range(len(hist)):
  40. sum_hist[i] += hist[i]
  41. else:
  42. sum_hist = hist
  43. n = len(hists)
  44. sum_hist = [x / n for x in sum_hist]
  45. return sum_hist
  46. for bin in res.keys():
  47. comp[bin] = avg_hists(res[bin])
  48. print comp.keys()
  49. return comp
  50. def get_avg_hists(self):
  51. return self.avg_hists
  52. def plot_hists(self):
  53. ph = PlotHelper()
  54. i = 0
  55. mx = 0
  56. for k in self.avg_hists.keys():
  57. hist = self.avg_hists[k]
  58. reds = hist[0:255]
  59. greens = hist[255:511]
  60. blues = hist[511:]
  61. reds = reds[25:-25]
  62. greens = greens[25:-25]
  63. blues = blues[25:-25]
  64. mx = max([mx, max(reds), max(greens), max(blues)])
  65. ph.addSeries(range(25, 25 + len(reds)), reds, plt=i, label="reds "+k)
  66. ph.addSeries(range(25, 25 + len(greens)), greens, plt=i, label="greens "+k)
  67. ph.addSeries(range(25, 25 + len(blues)), blues, plt=i, label="blues "+k)
  68. i += 1
  69. ph.set_xy_labels("Color Channel Values", "Avg. Color Value")
  70. ph.set_y_range(mx)
  71. ph.plot()