web-dev-qa-db-ja.com

OpenCVの同等のim2double関数Python

MATLABでは、次のコードが画像を読み込み、[0.0,1.0]間の値を正規化します。

img=im2double(imread('image.jpg')) 

OpenCV Pythonでこれを実行したいと思います。これを行う同等の機能はありますか?

次のコードを試しましたが、ソースIplImageを要求しています。また、Pythonのimreadに相当するものは何ですか?

def im2double(im):
    mat = cvGetMat(im);
    if CV_MAT_DEPTH(mat.type)==CV_64F:
       return mat
    im64f = array(size(im), 'double')
    cvConvertScale(im, im64f, 1.0, 0.0)
    return im64f
14
Naveen Raja

古いcvモジュールの使用は避け、numpy配列を使用するため、代わりにcv2を使用します。 numpy配列は、MATLABの配列および行列と非常によく似ています。

いずれの場合も、MATLABの im2double は、最小強度が0で最大強度が1になるように画像を正規化します。ピクセルin画像からimg

out = (in - min(img)) / (max(img) - min(img))

したがって、画像の最小値と最大値を見つけ、上記の操作を画像内のすべてのピクセルに適用する必要があります。マルチチャネル画像の場合、すべてのチャネルにわたってglobalの最小値と最大値を見つけ、すべてのチャネルに同じ操作を個別に適用します。

あなたの質問への短い答えは、次のように cv2.normalize を使用することです:

out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

最初の入力はソース画像で、floatに変換します。 2番目の入力は出力画像ですが、関数呼び出しでそれを返すため、Noneに設定します。 3番目と4番目のパラメーターは、出力に表示する最小値と最大値(それぞれ0と1)を指定し、最後の出力はhowを指定します画像を正規化したい。私が説明したのはNORM_MINMAXフラグに該当します。

あなたの他の質問は、画像を読むことに関してです。 cv2で画像を読み込むには、 cv2.imread を使用します。この関数への入力は、ロードするファイルを含む文字列です。したがって、上記の関数を次のように呼び出します。

img = cv2.imread('....') # Read image here
out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX) # Convert to normalized floating point

ただし、自分で何かを記述したい場合は、numpy操作を使用して簡単に作成できます。

そのため、次のように関数を記述します。

import cv2
import numpy as np

def im2double(im):
    min_val = np.min(im.ravel())
    max_val = np.max(im.ravel())
    out = (im.astype('float') - min_val) / (max_val - min_val)
    return out

次に、次のようなコードを使用します。

img = cv2.imread('...') # Read in your image
out = im2double(img) # Convert to normalized floating point

編集-2016年9月29日

最近のバージョンのMATLABでは、すべての数値をそのデータ型でサポートされている最大値で除算するだけです。たとえば、uint8の最大値は255ですが、uint16の最大値は65535です。

これを最新バージョンのMATLABに再実装したい場合は、 numpy.iinfo 関数を使用して、データ型の最小値と最大値を推測し、それに応じて変換できます。最大値にアクセスし、画像のすべての要素をこの数値で割ります。最初に画像を浮動小数点表現に変換してください。

import cv2
import numpy as np

def im2double(im):
    info = np.iinfo(im.dtype) # Get the data type of the input image
    return im.astype(np.float) / info.max # Divide all values by the largest possible value in the datatype