欠点検査コードができた。

画像ファイルのファイル名

KRGB107530G50は、白50%の中に白赤緑青の各100%70%50%30%の点が並べてある

KRGB107530G90は、白90%の中に白赤緑青の各100%70%50%30%の点が並べてある

という意味で作成しています。

白50%(透過光を想定)と白90%(反射光を想定)では、点が重ならないように、ずらしています。

画像データ0-255に変換されて、

白50%の中の白50%の点と、白90%の中の白100%の点以外は、赤四角で囲まれました。

from PIL import Image, ImageDraw
import datetime

# 画像を開く
ut_now = datetime.datetime.now()
print(ut_now, 'ファイルを開く')
im0 = Image.open("C:/code/py311/trial/KRGB107530G50.png")
im1 = Image.open("C:/code/py311/trial/KRGB107530G90.png")

# RGBそれぞれの平均値を算出
ut_now = datetime.datetime.now()
print(ut_now, '平均値算出0')
r_sum0, g_sum0, b_sum0 = 0, 0, 0
pixels0 = im0.load()
for i in range(im0.size[0]):
    for j in range(im0.size[1]):
        r, g, b = pixels0[i, j]
        r_sum0 += r
        g_sum0 += g
        b_sum0 += b
num_pixels = im0.size[0] * im0.size[1]
r_avg0 = int(r_sum0 / num_pixels)
g_avg0 = int(g_sum0 / num_pixels)
b_avg0 = int(b_sum0 / num_pixels)
print(f"image0.pngのRGB平均値: ({r_avg0}, {g_avg0}, {b_avg0})")

ut_now = datetime.datetime.now()
print(ut_now, '平均値算出1')
r_sum1, g_sum1, b_sum1 = 0, 0, 0
pixels1 = im1.load()
for i in range(im1.size[0]):
    for j in range(im1.size[1]):
        r, g, b = pixels1[i, j]
        r_sum1 += r
        g_sum1 += g
        b_sum1 += b
num_pixels = im1.size[0] * im1.size[1]
r_avg1 = int(r_sum1 / num_pixels)
g_avg1 = int(g_sum1 / num_pixels)
b_avg1 = int(b_sum1 / num_pixels)
print(f"image1.pngのRGB平均値: ({r_avg1}, {g_avg1}, {b_avg1})")

# 画像を走査して条件に合う画素を変更
ut_now = datetime.datetime.now()
print(ut_now, '画素走査と変更0')
pos_list = []
for i in range(im0.size[0]):
    for j in range(im0.size[1]):
        r, g, b = pixels0[i, j]
        if abs(r - r_avg0) > 30 or abs(g - g_avg0) > 30 or abs(b - b_avg0) > 30:
            pixels0[i, j] = (0, 0, 0)
            pos_list.append((i,j))

ut_now = datetime.datetime.now()
print(ut_now, '画素走査と変更1')
for i in range(im1.size[0]):
    for j in range(im1.size[1]):
        r, g, b = pixels1[i, j]
        if abs(r - r_avg1) > 30 or abs(g - g_avg1) > 30 or abs(b - b_avg1) > 30:
            pixels1[i, j] = (0, 0, 0)
            pos_list.append((i,j))

# 重複を削除して位置情報を記憶
ut_now = datetime.datetime.now()
print(ut_now, '重複を削除')
pos_list = list(set(pos_list))

# im1に対し欠点を四角で囲む書き込み
ut_now = datetime.datetime.now()
print(ut_now, '欠点を四角で囲む')
draw = ImageDraw.Draw(im1)
for pos in pos_list:
    x, y = pos
    draw.rectangle((x-50, y-50, x+50, y+50), outline="red", width=5)

# 画像を保存
ut_now = datetime.datetime.now()
print(ut_now, '画像を保存')
im1.save("C:/code/py311/trial/KRGB107530G90a.png")
ut_now = datetime.datetime.now()
print(ut_now, '終了')

目的通りの結果が出るが、自分のパソコンでは約19秒もの時間がかかってしまう。

使い物にならない。


配列は苦手なので、このfor文を使った表現は理解しやすいが、これを高速化する手法を思いつかない。


monicaにこのコードの高速化を聞いてみると、コードが出ず、こんなことしてみては、になった。

並列処理を導入する

  私にはまだ、multiprocessingは夢のまた夢。意味がわからない。

NumPyを使用する

  NumPyは、見ても使い方がわからず、拒否感が出る。

Pillow-SIMDを使用する

  難しいんだけど、高速化効果は1/2~1/3程度か。私にできるのか?

キャッシュを使用する

  私には何をどうしたらいいか、まったくわからない。


新しい第13世代のintelCPUは、かなり早くなっているようだ。

新しいPCではどのくらい早くなるか、teratailで聞いてみることにした。

コメント

このブログの人気の投稿