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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

Q&A

解決済

1回答

2025閲覧

日本語を含んだファイルをOpenCVのcv2.imreadで読み込む方法

hamayara2

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

0グッド

2クリップ

投稿2023/12/18 01:20

編集2023/12/18 01:37

実現したいこと

に書かれているヒストグラム平坦化処理という画像処理を日本語を含んだファイルでも実現したいため、その方法を探しています。
とりあえずPillowからNumPyに変換する方法を試したが画像を上手く読み込むことが出来ず困っています。

前提

下記のサイトを参考にPillowからNumPyへ変換するプログラムを組んだのですが
https://imagingsolution.net/program/python/opencv-python/read_save_image_files_in_japanese/#toc1)
エラーが発生してしまいます。
特に分からないのはcv2.imshowでは正常に写真が表示されるのにcv2.imreadだとエラーが発生することです。

発生している問題・エラーメッセージ

C:\Users\*****\Desktop\****>python path.py Traceback (most recent call last): File "C:\Users\******\Desktop\****\path.py", line 17, in <module> bookimg = cv2.imread((img)) TypeError: Can't convert object to 'str' for 'filename'

該当のソースコード

import cv2 import numpy as np from PIL import Image # Pillowで画像ファイルを開く pil_img = Image.open("4-20outpcb_01.png") # PillowからNumPyへ変換 img = np.array(pil_img) # カラー画像のときは、RGBからBGRへ変換する if img.ndim == 3: img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) cv2.imshow("Image", img) cv2.waitKey(0) bookimg = cv2.imread((img))

試したこと

bookimg = cv2.imread((img))を
bookimg = cv2.imread(str(img))
に変更すると今度はエラーが
can't open/read file: check file path/integrity
に変わり、結局動かすことができませんでした。

NumPyで画像ファイルを開き、OpenCV(NumPyのndarray)に変換する手法も同様の結果でした。

補足情報(FW/ツールのバージョンなど)

ツール
Windows 10(64bit)

Pythonバージョン
3.11.6

OpenCVのバージョン
4.8.1

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

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

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

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

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

hoshi-takanori

2023/12/18 02:02

cv2.imshow の引数 img は画像データそのものですが、cv2.imread に指定すべき引数は文字列 (ファイル名) なので…。
hamayara2

2023/12/18 02:30

コメントありがとうございます。 なんでcv2.imshowの方は大丈夫だったのか分かりました。 まだよく分かっていませんがこのPillowの手法ではファイル名の指定が出来ないということでしょうか? (とりあえずcv2.imread(str(img)はやったが失敗したので...) もしかして (https://qiita.com/SKYS/items/cbde3775e2143cad7455) のようなcv2.imread を np.fromfile + cv2.imdecode に分解して実行する方が良いのでしょうか?
jbpb0

2023/12/18 02:37

> pil_img = Image.open("4-20outpcb_01.png") img = np.array(pil_img) でちゃんと画像ファイルを読み込めてるから、 > cv2.imshow("Image", img) がうまくいくのですよね それなのに、なぜさらに > bookimg = cv2.imread((img)) と画像ファイルを読み込もうとしてるのでしょうか?
jbpb0

2023/12/18 02:45

https://qiita.com/picpie/items/050ed903eda93fffed10 のコードの bookimg = cv2.imread('画像ファイル名') を、 pil_img = Image.open("画像ファイル名") bookimg = np.array(pil_img) if bookimg.ndim == 3: bookimg = cv2.cvtColor(bookimg, cv2.COLOR_RGB2BGR) # この行はインデント有り に変えるだけでは、ダメでしょうか?
hamayara2

2023/12/18 03:05 編集

jbpb0さん。ありがとうございます。そのコメントで問題が解決できました。 > pil_img = Image.open("4-20outpcb_01.png") img = np.array(pil_img) の箇所やcv2.imshowの挙動を理解しておらず、 PillowからNumPyへ変換しても画像は読み込めていないと勘違いしてました。 貴方のコメントを参考に *** # Pillowで画像ファイルを開く pil_img = Image.open("4-20outpcb_01.png") # PillowからNumPyへ変換 img = np.array(pil_img) # カラー画像のときは、RGBからBGRへ変換する if img.ndim == 3: img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) *** のプログラムを追加した後 bookimg = cv2.imread('画像ファイル名') を削除して、bookimgの代わりにimgを使うようにすることで 正常に動作するようになりました。 ありがとうございます。
hamayara2

2023/12/18 03:05 編集

jbpb0さん。ベストアンサーに選びたいので同じような内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

こんな感じで日本語ファイル名の画像を読み込んでいました。
過去に作ったコードなので現環境で動かなかったら調整してください。

python

1def my_imread(path): 2 return cv2.imdecode(np.fromfile(path, np.uint8), cv2.IMREAD_UNCHANGED)

投稿2023/12/18 02:20

tabuu

総合スコア2492

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

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

hamayara2

2023/12/18 02:56

回答ありがとうございます。 こちらも試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問