目的が複数書かれていますが、とりあえず「青色のテキストを認識させたい。」について回答します。
対象が非常に理想的な画像なので、機械学習を使う必要はないと思います。
その中で、番号0の手順でどうしても色で認識させたいのです。
については、画素が青(というより水色っぽいので[R, G, B]=[0, 128, 255]あたり)に近いなら黒、そうでなければ白、といった具合に2値化するだけで抽出できます。
あとは輪郭検出をしてあげれば数字の認識に使えるのではないでしょうか。
上述した方法で2値化した対象画像です。
多少のJPEGノイズはありますが、ほぼ問題なく抽出できています。
使用したコード
Python
1import cv2
2import numpy as np
3
4
5def extract_by_colors(img_in, r, g, b, margin):
6 # 取得する色の範囲を指定
7 lower_r = max(r - margin, 0)
8 upper_r = min(r + margin, 255)
9 lower_g = max(g - margin, 0)
10 upper_g = min(g + margin, 255)
11 lower_b = max(b - margin, 0)
12 upper_b = min(b + margin, 255)
13 lower = np.array([lower_b, lower_g, lower_r])
14 upper = np.array([upper_b, upper_g, upper_r])
15
16 # 指定した色に基づいてマスク画像を作成し、元画像をマスク
17 img_out = cv2.bitwise_and(img_in, img_in, mask=cv2.inRange(img_in, lower, upper))
18
19 # 2値化
20 img_gray = cv2.cvtColor(img_out, cv2.COLOR_RGB2GRAY)
21 dummy, img_out = cv2.threshold(img_gray, 50, 255, cv2.THRESH_BINARY_INV)
22
23 return img_out
24
25
26if __name__ == "__main__":
27 img_in = cv2.imread("input.jpg")
28 img_out = extract_by_colors(img_in, 0, 128, 255, 127)
29 cv2.imwrite("output.jpg", img_out)