実現したいこと
今手持ちのWindows11+Pythonでの画像処理の計算速度が遅く、実際に新しいパソコンで動作させた場合、現実的な処理速度になるかがわかりません。
現在販売されている新しいパソコンでは、このコードでどのくらいの処理速度が実現できるのか、どのくらい早いパソコンを購入しないといけないのか、知りたいです。
また、プログラムを修正することで、今のパソコンでも処理速度を改善可能かどうか、知りたいです。
よろしくお願いします。
前提
i5-7400のパソコンで開発しています。
高解像度4656x3496(0.1mm程度)のUSBカメラで2回撮影するシート資材写真に写った0.1mm以上の欠点を発見して、OK/NGの表示判定するプログラムを作成しています。
その前段階として下記ソースコードの、GIMPで作成した下記リンクpngの動作チェック用画像に含まれる欠点を黒に変え赤い四角で囲むコードはできたのですが、(画像のRGBの平均を出し、平均から30以上離れた欠点を処理しています)
KRGB107530G50.png
KRGB107530G90.png
いかんせん自分のパソコンでは計算速度が遅く、写真撮影時間も考えると、現実的な処理時間になりません。
処理結果は次のpng画像です。
KRGB107530G90a.png
発生している問題・エラーメッセージ
2023-10-15 09:41:52.733589 ファイルを開く 2023-10-15 09:41:52.745589 平均値算出0 image0.pngのRGB平均値: (127, 127, 127) 2023-10-15 09:41:59.650292 平均値算出1 image1.pngのRGB平均値: (228, 228, 228) 2023-10-15 09:42:06.759561 画素走査と変更0 2023-10-15 09:42:14.034474 画素走査と変更1 2023-10-15 09:42:21.398917 重複を削除 2023-10-15 09:42:21.398917 欠点を四角で囲む 2023-10-15 09:42:21.398917 画像を保存 2023-10-15 09:42:21.806051 終了 画像処理に約19秒かかっており、実際にはLEDの安定化に4秒x2、撮影に1秒x2かかるので、これらだけでも計29秒もかかり現実的ではありません。
該当のソースコード
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, '終了')
試したこと
このi5-7400が、保有している一番高速なパソコンです。
改善できる方法には、たどり着けていません。
補足情報(FW/ツールのバージョンなど)
環境:
i5-7400 16GBメモリ 256GBSSD QuadroP600Video Windows11
VSCode 1.81.1 Python 3.11.4


回答2件
あなたの回答
tips
プレビュー