📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

Block iterator(vector 編2, matrix 編2) - Rubyist の Python 学習記録(15)

💡
この記事は 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

短いが今日はここまで.