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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6553閲覧

PythonでのOpenCV画像のピクセル単位の処理

sin_250

総合スコア112

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/08 15:27

編集2019/11/08 15:28

概要

PythonでOpenCVを使って読み込んだ画像に対して、
ピクセル単位で色を操作する場合の効率的(高速)な実装方法を知りたいです。

詳細

PythonでOpenCVで読み込んだ画像についてピクセル単位で色操作をしたいのですが、
現在私のコードは以下のようになっています。

ただ、Pythonでforループを使うのはとても遅いという理解をしていて(実際に数千枚の画像ファイルに対してバッチ処理すると激しく遅いです)
forループを使わずに書く実装方法を知りたいです。

python

1import numpy as np 2import cv2 3 4def convert_example(colors): 5 # colors = (Blue, Green, Red) 6 # この処理はただの例です。 実際にはもっと複雑な処理を想定してください。 7 return (colors[2], colors[0], max(0, int(colors[1]) - int(colors[2]))) 8 9image = cv2.imread('hoge.jpg') 10work = np.empty_like(image) 11 12rows, cols, _ = img.shape 13 14# forループだと多数のファイルに対してバッチ処理をすると遅い!? 15for i in range(rows): 16 for j in range(cols): 17 work[i, j] = convert_example(image[i, j]) 18 19cv2.imwrite('output.bmp', work)

想定環境

  • Anaconda & Jupyter Notebookで画像解析

よろしくお願い致します。

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

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

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

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

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

Q71

2019/11/09 00:19

OpenCVで操作できないような操作をしたい、ということでしょうか?
sin_250

2019/11/09 00:45

ありがとうございます。 Pythonの場合、forループは遅い一方、リスト内包表記やNumpyの行列計算をうまく使った書き方をすると速くなるというのがあると思います。 画像のデータに対してforループを使わずに画素毎の処理を書きたい、という質問でございます。 ただopencv-pythonのほうはあまり詳しくないのですが、同じようなことが実現できるOpenCVのAPIが もしあればそれをご教示頂けると助かります。 よろしくお願い致します。
meg_

2019/11/09 04:30

手動でやるなら質問者さんもおっしゃっているように、Numpyの行列計算を使うのが良いと思います。 Numpy同士の演算やNumpyの関数を使用すれば様々なことが実装可能だと思います。 OpenCVの関数については実現したいことをその都度調べるのが良いかと思います。
Q71

2019/11/09 23:40

Cythonは、変数の型が確定しているなら速くなります。Pythonで使うOpenCVは、C/C++で書かれたライブラリのPython用インターフェイスなので、速いです。Pythonはインタープリタなので、速さに限界があります。この様な事から、OpenCVでできないのかと尋ねました。
sin_250

2019/11/10 02:35

コメントありがとうございます。 OpenCVをPythonで使うことについて経験不足のため、OpenCVでできることに理解が浅いかもしれないのですが、 一般的な画像の縮小・拡大・回転・ネガ反転のような操作「以上」のことをしようとしていました。 簡単に言うと、BMP画像の各画素におけるRGBの3バイトの中にとある情報を埋め込み、 それをPythonで取り出す(デコード)するような操作です。 たとえば、各画素のR(Red)1byte領域の2bit目の値を取り出したい、などです。 もしOpenCVで各画素に対する汎用的なforEach的APIがあればそれが求めるものなのですが、 ググった限りでは見つけられず、自己解決方法のとおり、普通のPythonのforループをnumbaで高速化しました。
guest

回答1

0

自己解決

どうも色々調べた限り、実装の簡便さと実行スピードのバランスを取ると、
Numbaで高速化するのが最もEasyという結論に至りました。

Numpyの行列計算をうまく使うと(?)出来そうなのですが、行列計算の実装がぱっと頭に思い浮かばず
(MATLAB由来の行列計算を多用する実装の経験がなく、そういう実装に慣れていません)
JITコンパイラでforループを腕力で高速化してしまえ、となりました。

Cythonも試してみましたが、安易に使うならNumbaの方が簡単そうです。

python

1import numpy as np 2import numba as nb 3import cv2 4 5@nb.njit 6def convert(color_base, color_target): 7 color_target[0] = color_base[1] 8 color_target[1] = color_base[2] 9 color_target[2] = color_base[0] 10 11@nb.njit 12def process_numba(base, target): 13 rows, cols, _ = base.shape 14 for i in range(rows): 15 for j in range(cols): 16 convert(base[i, j], target[i, j]) 17 18image = cv2.imread('hoge.jpg') 19work = np.empty_like(image) 20 21process_numba(image, work) 22 23cv2.imwrite('foo.bmp', work)

投稿2019/11/09 15:07

sin_250

総合スコア112

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問