PythonLibrary Python 2019年 1月 3日
MonoImage は NumPy の ndarray を内包するクラスとする. また,ndarray の type とは別に画像のビット数をインスタンスとして持つ. まずは,コンストラクタのテストと,いくつかの読み込みプロパティのテストだけを実施してみる.
from nose2.tools import such
import numpy as np
from hkob_pyimage import MonoImage
with such.A('MonoImage class') as it:
@it.has_test_setup
def setup():
np.set_printoptions(threshold=10)
it.mu8 = MonoImage(np.array([[10, 20, 30], [40, 50, 60]], dtype=np.uint8))
it.mi16 = MonoImage(np.array([[1, -2], [-3, 4], [5, -6]], dtype=np.int16), 16, True)
it.md = MonoImage(np.array([3.1, 1.4, 1.5, 9.2, 6.5, 3.5], dtype=np.double), 0)
it.marray = (it.mu8, it.mi16, it.md)
@it.has_teardown
def teardown():
pass
@it.should('have correct getter properties.')
def test():
it.assertEqual([x.bits for x in it.marray], [8, 16, 0])
it.assertEqual([x.signed for x in it.marray], [False, True, False])
it.assertEqual([x.dtype for x in it.marray], [np.uint8, np.int16, np.double])
it.assertEqual([x.width for x in it.marray], [3, 2, 6])
it.assertEqual([x.height for x in it.marray], [2, 3, 1])
it.assertEqual([x.max_value for x in it.marray], [255, 65535, 0])
it.createTests(globals())
from nose2.tools import such
import numpy as np
with such.A('MonoImage class') as it:
@it.has_test_setup
def setup():
np.set_printoptions(threshold=10)
it.mu8 = MonoImage(np.array([[10, 20, 30], [40, 50, 60]], dtype=np.uint8))
it.mi16 = MonoImage(np.array([[1, -2], [-3, 4], [5, -6]], dtype=np.int16), 16, True)
it.md = MonoImage(np.array([3.1, 1.4, 1.5, 9.2, 6.5, 3.5], dtype=np.double), 0)
it.marray = (it.mu8, it.mi16, it.md)
@it.has_teardown
def teardown():
pass
@it.should('have correct getter properties.')
def test():
it.assertEqual([x.bits for x in it.marray], [8, 16, 0])
この行は,RSpec だと以下のような表記になるだろう.
expect(subject.map(&:bits)).to eq [8, 16, 0]
it.createTests(globals())
change:mono_image.py
ERROR
======================================================================
ERROR: LayerSuite
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/hkob/python3/hkob_pyimage/tests/test_mono_image.py", line 8, in setup
it.mu8 = MonoImage(np.array([[10, 20, 30], [40, 50, 60]], dtype=np.uint8))
TypeError: MonoImage() takes no arguments
----------------------------------------------------------------------
Ran 0 tests in 0.000s
FAILED (errors=1)
import numpy as np
class MonoImage:
def __init__(self, array, bits=8, signed=False):
self._array = array
self._bits = bits
self._signed = signed
change:mono_image.py
test 0000: should have correct getter properties. (test_mono_image.A MonoImage class) ... ERROR
======================================================================
ERROR: test 0000: should have correct getter properties. (test_mono_image.A MonoImage class)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/hkob/python3/hkob_pyimage/tests/test_mono_image.py", line 19, in test
it.assertEqual([x.bits for x in it.marray], [8, 16, 0])
File "/Users/hkob/python3/hkob_pyimage/tests/test_mono_image.py", line 19, in <listcomp>
it.assertEqual([x.bits for x in it.marray], [8, 16, 0])
AttributeError: 'MonoImage' object has no attribute 'bits'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
class MonoImage:
(中略)
@property
def bits(self):
return self._bits
change:mono_image.py
test 0000: should have correct getter properties. (test_mono_image.A MonoImage class) ... ERROR
======================================================================
ERROR: test 0000: should have correct getter properties. (test_mono_image.A MonoImage class)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/hkob/python3/hkob_pyimage/tests/test_mono_image.py", line 20, in test
it.assertEqual([x.signed for x in it.marray], [False, True, False])
File "/Users/hkob/python3/hkob_pyimage/tests/test_mono_image.py", line 20, in <listcomp>
it.assertEqual([x.signed for x in it.marray], [False, True, False])
AttributeError: 'MonoImage' object has no attribute 'signed'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
class MonoImage:
(中略)
@property
def signed(self):
return self._signed
@property
def dtype(self):
return self._array.dtype
@property
def width(self):
return self._array.shape[1] if self._array.ndim > 1 else self._array.shape[0]
@property
def height(self):
return self._array.shape[0] if self.ndim > 1 else 1
@property
def max_value(self):
return 0 if self._bits == 0 else (1 << self._bits)-1
change:mono_image.py
test 0000: should have correct getter properties. (test_mono_image.A MonoImage class) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
長くなったので今日はここまで.