Gasyori100knock
Gasyori100knock copied to clipboard
7.~13.「フィルタリング地獄」の一部分のプログラミングコードについて
画像処理の勉強始めたての初心者ですが、僭越ながら7.~10.のプログラミングコードについて確認と提案があります。 それぞれのコードには
c = 1 if len(out.shape) == 2 else out.shape[2]
となっている部分があり、素人ながらこの部分や変数cの意味を考えたときに「RGB画像でもGrayscale画像にも柔軟にフィルタを使えるようにしたのだろうか」と考えたのですが、お間違い無いでしょうか。 また、以上の仮定を正とした時の、改善コードを提案いたします。(そのままですと、Grayscale画像ではエラーを吐いてしまいました) ご精査いただけますと幸いです。(7.の場合のみ提示します、8.以降は現時点で当方未確認ですが、多分追加した部分を加えればいけるのではないかと思います、ただ13.はGrayscale用に設計されているようですので、この件とは別問題になりそうです)
def pool_average(img, ksize_h=8, ksize_w=8):
_img = img.copy().astype(np.float32)
# padding
h, w = img.shape[:2]
outer_h = h % ksize_h
pad_top = outer_h // 2
pad_bottom = outer_h - pad_top
outer_w = w % ksize_w
pad_left = outer_w // 2
pad_right = outer_w - pad_left
#grayscaleの場合はpadする際に一旦三次元に増やさないといけないはずです
if len(_img.shape)==2:
_img = _img[:, :, np.newaxis]
_img = np.pad(_img, [(pad_top, pad_bottom), (pad_left, pad_right), (0, 0)], 'edge')
out = np.zeros_like(_img)
new_h, new_w = out.shape[:2]
#無理やり次元を増やせば分岐がいらなくなります
c=out.shape[2]
#c = 1 if len(out.shape) == 2 else out.shape[2]
# filtering
for iy in range(0, new_h, ksize_h):
for ix in range(0, new_w, ksize_w):
for ic in range(c):
out[iy : iy + ksize_h, ix : ix + ksize_w, ic] = _img[iy : iy + ksize_h, ix : ix + ksize_w, ic].mean()
#grayscaleの場合は増やした次元を元に戻さないといけません
if len(img.shape)==2:
out=out[..., 0]
out = out[pad_top : pad_top + h, pad_left : pad_left + w]
return np.clip(out, 0, 255).astype(np.uint8)