Scan切り抜きは結局座標指定が強い

Scan切り抜きは結局座標指定が強い

Soundtrack購入

先日、ふと思い立ち、Splatoonのサントラをまとめて購入した。

Splatoon 2, 3のサントラ

音声は超高音質900kbpsで取り込んだ。
興味深かったのは、超高音質で負荷が大きいかと思いきや、まったくそんなことがなく、むしろいつもより静かだった。
おそらく、192kbpsに圧縮するために頑張っていたのだろう。

ブックレット取り込み

さて、本題。
CDは音楽こそメインだが、サントラともなると外箱やブックレットに個性があり、それを取り逃すのは忍びない。

ホッチキスで止められているだけなので、外してScanSnap S1500で取り込んでもよいが、
大したページ数でもないし、十分薄いしということでリビングのプリンターの付属スキャナ機能で取り込むことに。

結果、十分満足できるクオリティで読み込みが完了した。

Splatune3の表紙

読み込んだ画像 on Explorer

Croping - 試行錯誤 -

余計な余白があるので、その部分を削ることに。
せっかくかぐや様の帯読み込みで整備したScriptがあるので、
それを使おうと意気込んでいたのだが……。

読み込み画像 (matplotlib特有のRGBとBGRのずれで青みがかっている)

二値化

画像左下に、全体を通して2本の影がある。邪魔だなぁ。
明暗が微妙で、2値化でも削り切れるか怪しい。

周囲が白い画像

周囲が白い画像の二値化

モルフォロジー変換の拡大縮小でも削り切れないし、
何なら白っぽいページの時に周囲の必要な枠が削れるほうが影響がでかい。

周囲が白い画像の境界読み取り

黒い画像の境界読み取り

そこから領域の辺の長さに制限をかけてみたり試行錯誤したが、
影を削り切ることは難しそうだ……。

もちろん、無視するべき影の座標を指定すればどうにかはできるかもしれないが……。

ここで気が付いた。
「ブックレットごとにページの大きさも読み取り位置もほぼ固定なんだから、座標だけで切り抜けばいいのでは?」

Croping - 結論 -

はたしてその気付きは正しく、むしろいつもの漫画読み取りの表紙より位置ずれが少ない分、相当理想的だった。
各ブックレットごとに1つの画像をペイントで開き、少しだけ余裕をもって座標を読み取る。
あとはPythonのOpenCVで画像を開いてnumpy.ndarrayとしてcropするだけだ。

同じ読み取り位置が1-2枚程度しかない場合は、個別にペイントで切り抜いてしまった。

Croping完了した画像は以下のようになった。

Crop後の画像 on Explorer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# path管理に、以前までのstringとglob2ではなく、pathlib.Pathを用いているので注意
import pathlib
import cv2
import os
now_dir = pathlib.Path(
os.getenv("HOME") + "/downloads/drive-download-20231205T150014Z-001"
)
img_paths = sorted([s for s in now_dir.glob("*.jpg")])
album = "Zelda-BotW"
output_dir = pathlib.Path(os.getenv("HOME")) / "heavyD/output"
for ind_img, img_path in enumerate(img_paths[2:14]):
image = cv2.imread(img_path.as_posix())
num_zfill = str(ind_img + 1).zfill(3)
# image_out=cv2.rotate(image[:2840, :1420, :], cv2.ROTATE_90_CLOCKWISE)
image_out = cv2.rotate(image[:3285, :2200, :], cv2.ROTATE_90_CLOCKWISE)
cv2.imwrite((output_dir / f"{album}_{num_zfill}.jpg").as_posix(), image_out)

何事も初動が肝心。
多少面倒でも、座標や命名則は統一しておくと、どんなものより正確性と効率を担保してくれるのだ。

コメント