欠点検査コードができた。
画像ファイルのファイル名
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で聞いてみることにした。
コメント
コメントを投稿