質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

929閲覧

pysonでopencvを利用して画像の保存ができない

puroknow

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2024/01/01 17:17

編集2024/01/02 00:23

実現したいこと

フォルダ内にある画像すべてをグレースケール、二値化し、処理した画像をすべて保存したい。

発生している問題・分からないこと

エラーは出ていませんが、指定したフォルダに画像が保存されていない状況です。

該当のソースコード

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)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

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()

補足

初心者で元日から始めたばかりで、コードの意味など深くは理解していないです。
ネットで調べたつぎはぎでコードを記載しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/01/01 17:56 編集

> 指定したフォルダに画像が保存されていない状況です。 処理した画像をファイルに保存する際に、出力するファイルパスを表示してみてください。画像が保存されない理由が判るかと思います。 #画像の保存 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) pathlib を利用して以下の様にしてもよいかと思います。 #画像の保存 p = pathlib.Path(img_file_name) stem, ext = p.stem, p.suffix cv2.imwrite(File_Path + stem + '_0' + ext, img_gray) cv2.imwrite(File_Path + stem + '_1' + ext, img_th)
hiroki-o

2024/01/01 18:58

melianさん、それ回答に書いたほうがいいですよ。もったいないです...
puroknow

2024/01/02 00:24

コメントありがとうございます。printで表示しましたがまだ解決できていません。 試した結果を質問に追記しました。
puroknow

2024/01/02 00:55 編集

解決しました。 ①フォルダのパスから日本語を削除 ②hiroki-oさんの回答をコードに追記 でフォルダに画像が格納されました。 日本語が入るとバグってしまうものなんですね。。
melian

2024/01/02 00:57

例えば、 C:/Users/PC_User/デスクトップ/二値化後の画像/C:\Users\PC_User\デスクトップ\GAZOU\R.jpg_0 となっていて、C:/Users/PC_User/デスクトップ/ が2回現れています。これは画像のファイルパス(img_file_name)が絶対パスのままであるためです。 > エラーは出ていませんが、 OpenCV ではエラーが発生してもエラーメッセージを表示しないメソッドがあって、cv2.imwrite()もその一つです。
puroknow

2024/01/02 04:22

なるほどそうなんですね。 勉強になりました。 補足ありがとうございます!
guest

回答1

0

ベストアンサー

Windows 11、Python 3.12.1で確認しました。

# 1行追加 import os # 2行変更(ASCII文字のみのパスの場合) cv2.imwrite(File_Path+os.path.splitext(os.path.basename(img_file_name))[0]+"_0"+".jpg",img_gray) cv2.imwrite(File_Path+os.path.splitext(os.path.basename(img_file_name))[0]+"_1"+".jpg",img_th) #日本語を含むパスの場合 ret,gray=cv2.imencode(".jpg",img_gray) gray.tofile(File_Path+os.path.splitext(os.path.basename(img_file_name))[0]+"_0"+".jpg") ret,th=cv2.imencode(".jpg",img_th) th.tofile(File_Path+os.path.splitext(os.path.basename(img_file_name))[0]+"_1"+".jpg")

(追記)

  • imwriteの2行目、"_0"から"_1"に修正しました。
  • imwriteは日本語パスに対応していないため、日本語パスに対応する方法を追記しました。どちらの方法も全く同一のjpegファイルを出力することを確認済みです。

投稿2024/01/01 17:52

編集2024/01/02 04:17
hiroki-o

総合スコア1361

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puroknow

2024/01/02 05:39

ありがとうございました。 日本語のファイルを処理しても問題なく動くようになりました。 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問