00001
00002
00003
00004 from unittest import TestCase
00005 from unittest import TestSuite
00006
00007 from enhanced_grid import Grid2D
00008
00009 from tiles import energy2
00010 from tiles import energy3
00011 from tiles import calc_acc_energy
00012 from tiles import find_min_seam
00013 from tiles import quilt
00014
00015 from tiles import ENERGY_MAX
00016
00017 from image import greyscale_grid_to_rgb_grid
00018 from image import grid_to_rgb_image
00019
00020 def add_colors(obj):
00021 obj.white = (1, 1, 1, 1)
00022 obj.black = (0, 0, 0, 1)
00023 obj.grey = (0.5, 0.5, 0.5, 1)
00024
00025 obj.brown = (0.7, 0.3, 0.1, 1)
00026 obj.washblue = (0.1, 0.3, 0.7, 1)
00027
00028 obj.red = (1, 0, 0, 1)
00029 obj.green = (0, 1, 0, 1)
00030 obj.blue = (0, 0, 1, 1)
00031
00032 obj.darkred = (0.5, 0, 0, 1)
00033 obj.darkgreen = (0, 0.5, 0, 1)
00034 obj.darkblue = (0, 0, 0.5, 1)
00035
00036
00037 def make_checker_grid(col_obj):
00038 checker_grid = Grid2D((50, 30), col_obj.white)
00039
00040 for index in checker_grid.index_iter():
00041 x, y = index
00042 if (x + y) % 2 == 0:
00043 checker_grid[index] = col_obj.black
00044 return checker_grid
00045
00046 def make_half_checker_grids(col_obj):
00047 checker_grid1 = Grid2D((50, 30), col_obj.white)
00048 checker_grid2 = Grid2D((50, 30), col_obj.white)
00049
00050 for index in checker_grid1.index_iter():
00051 x, y = index
00052 checker_grid = checker_grid1
00053
00054 if x < 25:
00055 checker_grid = checker_grid2
00056 if x != 25:
00057 if (x + y) % 2 == 0:
00058 checker_grid[index] = col_obj.black
00059 else:
00060 checker_grid[index] = col_obj.grey
00061
00062 return checker_grid1, checker_grid2
00063
00064 class TestEnergy2(TestCase):
00065 def setUp(self):
00066 add_colors(self)
00067
00068 def testMax(self):
00069 self.assertAlmostEqual(energy2(self.black, self.white), 3)
00070 self.assertAlmostEqual(energy2(self.white, self.black), 3)
00071
00072 def testSymmetry(self):
00073 self.assertAlmostEqual(energy2(self.washblue, self.brown), energy2(self.brown, self.washblue))
00074
00075 def testZeroEnergy(self):
00076 self.assertAlmostEqual(energy2(self.brown, self.brown), 0)
00077
00078 def testChannelEquivalence(self):
00079 self.assertAlmostEqual(energy2(self.red, self.darkred),
00080 energy2(self.blue, self.darkblue))
00081 self.assertAlmostEqual(energy2(self.red, self.darkred),
00082 energy2(self.green, self.darkgreen))
00083
00084 class TestEnergy3(TestCase):
00085 def setUp(self):
00086 add_colors(self)
00087
00088 def testMax(self):
00089 self.assertAlmostEqual(energy3(self.white, self.black, self.black), 6)
00090 self.assertAlmostEqual(energy3(self.black, self.white, self.white), 6)
00091
00092 def testSymmetry(self):
00093 self.assertAlmostEqual(energy3(self.black, self.washblue, self.brown),
00094 energy3(self.black, self.brown, self.washblue))
00095 self.assertAlmostEqual(energy3(self.black, self.brown, self.washblue),
00096 energy3(self.black, self.washblue, self.brown))
00097 self.assertAlmostEqual(energy3(self.brown, self.washblue, self.black),
00098 energy3(self.washblue, self.brown, self.black))
00099 self.assertAlmostEqual(energy3(self.washblue, self.brown, self.black),
00100 energy3(self.brown, self.washblue, self.black))
00101
00102 def testZero(self):
00103 self.assertAlmostEqual(energy3(self.brown, self.brown, self.brown), 0)
00104
00105 def testChannelEquivalence(self):
00106 self.assertAlmostEqual(energy3(self.red, self.darkred, self.black),
00107 energy3(self.blue, self.darkblue, self.black))
00108 self.assertAlmostEqual(energy3(self.red, self.darkred, self.black),
00109 energy3(self.green, self.darkgreen, self.black))
00110
00111 def testDouble(self):
00112 self.assertAlmostEqual(2*energy3(self.brown, self.washblue, self.brown),
00113 1*energy3(self.brown, self.washblue, self.washblue))
00114 self.assertAlmostEqual(2*energy3(self.washblue, self.washblue, self.brown),
00115 1*energy3(self.washblue, self.brown, self.brown))
00116
00117 class TestCalcAccEnergy(TestCase):
00118 def setUp(self):
00119 add_colors(self)
00120
00121 self.checker_grid = make_checker_grid(self)
00122 self.checker_grid1, self.checker_grid2 = make_half_checker_grids(self)
00123
00124 def testZero(self):
00125 washblue_grid = Grid2D((50, 30), self.washblue)
00126
00127 acc_energy = calc_acc_energy(washblue_grid, washblue_grid)
00128
00129 for index in acc_energy.index_iter():
00130 x, y = index
00131 if (x > 0):
00132 self.assertAlmostEqual(acc_energy[index], 0)
00133 else:
00134 self.assertAlmostEqual(acc_energy[index], ENERGY_MAX)
00135
00136 def testGrowing(self):
00137 acc_energy = calc_acc_energy(self.checker_grid, self.checker_grid)
00138
00139 w, h = self.checker_grid.dims
00140 for i in range(1, w-1):
00141 for j in range(1, h):
00142 self.assertTrue(acc_energy[i, j] >= min(acc_energy[i, j-1], acc_energy[i-1, j-1], acc_energy[i+1, j-1]))
00143
00144 def testAccEnergy(self):
00145 acc_energy = calc_acc_energy(self.checker_grid1, self.checker_grid2)
00146
00147 print acc_energy[:,0]
00148
00149
00150 class TestFindMinSeam(TestCase):
00151 def setUp(self):
00152 add_colors(self)
00153
00154 self.checker_grid = make_checker_grid(self)
00155 self.checker_grid1, self.checker_grid2 = make_half_checker_grids(self)
00156
00157 def testSeam(self):
00158 seam = find_min_seam(self.checker_grid1, self.checker_grid2)
00159
00160 for item in seam:
00161 self.assertEqual(item, 25)
00162
00163
00164