実現したいこと
フォルダ内にある画像すべてをグレースケール、二値化し、処理した画像をすべて保存したい。
発生している問題・分からないこと
エラーは出ていませんが、指定したフォルダに画像が保存されていない状況です。
該当のソースコード
import pathlib import cv2 import numpy as np input_dir = "C:/Users/PC_User/デスクトップ/GAZOU" input_list = list(pathlib.Path(input_dir).glob('**/*.jpg')) File_Path= "C:/Users/PC_User/デスクトップ/二値化後の画像/" for i in range(len(input_list)): img_file_name = str(input_list[i]) img_np = np.fromfile(img_file_name, dtype=np.uint8) img = cv2.imdecode(img_np, cv2.IMREAD_COLOR) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #特定の範囲のGaussian分布から閾値を自動で決めて二値化 ret,img_th=cv2.threshold(img_gray,0,255,cv2.THRESH_OTSU) #全体の画素数 whole_area=img_th.size #白部分の画素数 white_area=cv2.countNonZero(img_th) #黒部分の画素数 black_area=whole_area-white_area #画像の保存 cv2.imwrite(File_Path+img_file_name+"_0",img_gray) cv2.imwrite(File_Path+img_file_name+"_1",img_th)
試したこと・調べたこと
上記の詳細・結果
printで画像を表示させました。すべて同時に表示されないが、2個ずつ(グレースケールと二値化の画像)は表示される状態です。
→訂正です。printは誤記です。imshowで画像を表示させたところ、画像は表示されました。おそらく、画像の読み込みはできています。保存ができません。
画像は表示されていましたが、デスクトップ/二値化後の画像のところがバグって変な言葉のファイル名になっていました。
jupyter notebookでコードを実行しています。
また回答通りに.jpgを追加しましたが、指定したフォルダに画像は保存されていませんでした。
printのところを見逃していました。
printで出した結果は下記です。(処理画像を3つ入れているので6つのファイル名が出ています。
C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\20181025.000234.jpg_0
C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\20181025.000234.jpg_1
C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\R.jpg_0
C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\R.jpg_1
C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\test.jpg_0
C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\test.jpg_1
下記からが修正したコードです。
また画像を
import pathlib
import cv2
import numpy as np
import os
input_dir = "C:/Users/PC_User/デスクトップ/GAZOU"
input_list = list(pathlib.Path(input_dir).glob('**/*.jpg'))
File_Path= "C:/Users/PC_User/デスクトップ/二値化後の画像/"
for i in range(len(input_list)):
img_file_name = str(input_list[i])
img_np = np.fromfile(img_file_name, dtype=np.uint8)
img = cv2.imdecode(img_np, cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#特定の範囲のGaussian分布から閾値を自動で決めて二値化
ret,img_th=cv2.threshold(img_gray,0,255,cv2.THRESH_OTSU)
#全体の画素数
whole_area=img_th.size
#白部分の画素数
white_area=cv2.countNonZero(img_th)
#黒部分の画素数
black_area=whole_area-white_area
#画像の保存
print(File_Path+img_file_name+"_0")
cv2.imwrite(File_Path+img_file_name+"_0",img_gray)
print(File_Path+img_file_name+"_1")
cv2.imwrite(File_Path+img_file_name+"_1",img_th)
#画像の表示 cv2.imshow(img_file_name+"_0.jpg",img_gray) cv2.imshow(img_file_name+"_1.jpg",img_th) cv2.waitKey(0) cv2.destroyAllWindows()
補足
初心者で元日から始めたばかりで、コードの意味など深くは理解していないです。
ネットで調べたつぎはぎでコードを記載しています。
0 コメント