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
古い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
最近のバージョンの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