画像認識AIを使わずにデジタル数字認識（小説風）

:::note info
この記事はChatGPTを使って作成されています。温かい目で見ていただけますと幸いです。
:::

# プロローグ
ある日、科学者たちが集まって、画像から数字を読み取る新しい方法を発明しようとしていました。彼らはAIに頼らず、脳筋アルゴリズムでこの難題に挑むことを決意しました。果たして、彼らの試みは成功するのでしょうか？

# 科学者たちの集い
ある日、科学者たちが大切な会議のために集まりました。彼らの目的は、画像から数字を読み取る新しい方法を発明することでした。会議室には、様々な分野の専門家が集結し、情熱と興奮が空気を支配していました。

![mensetsu_group_discussion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468749/fddaa18d-1530-4c06-d436-7cf42e6ee18e.png)

科学者1: 「AIを使わずに、画像から数字を読み取る方法って、可能なのかな？」

科学者2: 「もちろん可能さ！AIに頼らなくても、私たちの頭脳と力を使えば何でもできるはずだ！」

リーダー: 「そうだ！我々は脳筋でこの問題に立ち向かうのだ！」

# 脳筋アルゴリズムへの挑戦
決意を固めた科学者たちは、研究室に籠もりました。彼らはコンピューターを使わず、紙と鉛筆を手に、数学と直感の力を駆使して、画像から数字を読み取るアルゴリズムを開発を始めました。

![kenkyu_man_naayamu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468749/223ffaa8-a428-7533-93b7-91ad08d6e0a0.png)


科学者3: 「ここはこの数字がこう見えるだろうなぁ…」

科学者4: 「でもこの数字はこうじゃないか？」

リーダー: 「なるほど、それじゃあこれなら…!」

彼らはアイデアを出し合い、試行錯誤しながら、独自の方法を見つけ出しました。

### アルゴリズムの概要
![estimate_weight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468749/58d7a6b8-3aac-96c4-9baf-c85fa60326e8.png)

### 直線検出の工夫
>黒色の直線を認識しやすくするために、
>・画像の濃淡を反転 (bitwise_not関数)
>・画像を2値化(threshold関数)
>・欠損ノイズを補正(dilate関数)
```python:lib/util.py
# 75～82行目付近

# ビット変換
reversed_img = cv2.bitwise_not(img)

# グレースケール変換
gray_img = cv2.cvtColor(reversed_img, cv2.COLOR_BGR2GRAY)

# 二値化
ret, thresh_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)

# 膨張処理
dilation = cv2.dilate(thresh_img, self.kernel, iterations=1)
```

>直線検出の条件
>・画像の高さの半分より長い黒ピクセルの連続があれば、縦線ありとみなす
>・半分より長い連続がなければ、縦線なしとみなす
```python:lib/util.py
# 92～100行目付近

# 画像の高さの半分より長い縦線があるなら、縦線ありとみなす
# 画像の高さの半分より長い縦線がないなら、縦線なしとみなす
for i in range(width-1):
    for j in range(half_height-1):
        tmp = dilation[j:j+half_height, i:i+1]
        white_pixels = np.count_nonzero(tmp)
        if (white_pixels == tmp.size):
            vertical_lines.append(i)
            break
```

# 真の力の発揮

数日間の努力の後、科学者たちはついに成功に近づいていました。彼らは画像から数字を読み取る脳筋アルゴリズムを完成させ、満足げな笑顔を浮かべました。

![group_medical.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468749/c0eb2c1b-44db-7c58-48f9-fc24590b5599.png)

リーダー: 「これで見えるぞ！AIなんていらなかったんだ！」

科学者たち: 「イェーイ！」

彼らの偉業は、世界中に広まり、驚きと称賛を集めました。AIに頼らず、ただの人間の力だけで、画像から数字を読み取る方法が発明されたのです。彼らの冒険はまるで漫画の世界から飛び出してきたかのようでした。

# エピローグ
しかし、物語の終わりではなく、新たな課題が待ち受けていました。科学者たちは喜びに満ちた勝利の瞬間を楽しんでいましたが、その後、彼らは厳しい現実に直面しました。

画像に影が入ると、脳筋アルゴリズムは失敗してしまうことが判明したのです。これまでの成功の裏には、まだ解決されていない課題が潜んでいたのです。

### 画像に影が入った場合の例
![IMG_0742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468749/a84970d9-9b4f-0304-5d5a-c3b14f400b3d.jpeg)
この影により画像の2値化がうまくいかないようです。


![kenkyu_woman_naayamu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468749/86869de8-4e46-16f4-d5d7-9ebc3c44f849.png)

リーダー: 「これは予期せぬ困難だ。しかし、私たちの挑戦は終わらない。新たな問題に立ち向かい、より強く、より賢くならねばならない。」

科学者たち: 「そうだ！私たちは挫けない！次なる挑戦に備えよう！」

彼らは新たな課題に向けて準備を始めました。失敗や障害があっても、彼らの冒険は続くのです。次なる試練に立ち向かうために、彼らの脳筋と創造力が今も燃え続けています。

# プログラム
もし良かったら、実際に操作してみてください！

https://github.com/Thyme0113/estimate_weight

# 参考文献
よくよく調べたら、他の人も同じ方法でやってた...😢

https://pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/

https://monowith.com/program/opencv-threshold/

https://blanktar.jp/blog/2015/07/python-opencv-crop-box#:~:text=%23%21%2Fusr%2Fbin%2Fpython3%20import%20cv2%20import%20numpy%20def%20transform_by4%28img%2C%20points%29%3A,y%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%84%E3%82%82%E3%81%AE%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%E3%80%82%20top%20%3D%20sorted%28points%5B%3A2%5D%2C%20key%3Dlambda%20x%3Ax%29%20%23%20%E5%89%8D%E5%8D%8A%E4%BA%8C%E3%81%A4%E3%81%AF%E5%9B%9B%E8%A7%92%E5%BD%A2%E3%81%AE%E4%B8%8A%E3%80%82