💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
MonoImageBlockIterator をベクトル,行列で利用できるようになった. 前回は,ブロックサイズに満たないブロックを無視するように is_small_ok = False の場合のみをテストした. 今回は,is_small_ok = True の例として,画像のブロックごとの平均を使った縮小処理のテストをしてみる.
画像の平均による縮小処理
-
generate_with_mean(br, bc) のテストを記述する. br, bc のサイズのブロックの平均値を求め,その平均値を画素とする縮小画像を作成する. ブロックスクランブルと異なり,ブロックが br, bc よりも小さいサイズの場合でも,縮小処理を行う.
with such.A('MonoImage class') as it: @it.should('calc block mean') def test(): ### vector test org_vec = MonoImage(np.arange(0, 9), 8) correct_vec = MonoImage.create_with_array([0, 2, 4, 6, 8], np.int, 8) ans_vec = org_vec.generate_with_mean(1, 2) it.assertEqual(ans_vec, correct_vec) ### matrix test org_mat = MonoImage(np.arange(0, 35).reshape(5, 7), 8) correct_mat = MonoImage.create_with_array([[4, 7, 9], [18, 21, 23], [29, 32, 34]], np.int, 8) ans_mat = org_mat.generate_with_mean(2, 3) it.assertEqual(ans_mat, correct_mat)
generate_with_mean の実装
-
generate_with_mean は以下のように実装できる. まず,nc, nr で縮小画像の大きさを取得し,その大きさの画像を create_with_zeros て作成している. あとは,縮小画像の値を入れる pixel_iterator と,平均のブロックを取得する block_iterator を回すだけでよい. 小さいブロックサイズでもイテレータを回すために,block_iterator() の is_small_ok を True にしている. 今回は,MonoImageBlockIterator でうまく隠蔽できたので,ベクトルか行列かを意識する必要はない.
class MonoImage: def generate_with_mean(self, br, bc): nr = int((self.height + br - 1) / br) nc = int((self.width + bc - 1) / bc) ans = self.create_with_zeros((nr, nc), self.dtype) for (pi, bi) in zip(ans.pixel_iterator(), self.block_iterator(br, bc, br, bc, True)): pi.value = np.mean(bi.value) return ans
短いが今日はここまで.