簡體   English   中英

如何使用OpenCV Python復制Tensorflow圖像處理

[英]How to replicate tensorflow image processing using opencv python

嗨,我需要使用python cv2來完成由tensorflow在下面的代碼片段中進行的完全相同的預處理。 請幫忙!

file_name = 'image path'
input_name = 'file_reader'
input_height=299
input_width=299
input_mean=0
input_std=255

file_reader = tf.read_file(file_name, input_name)
image_reader = tf.image.decode_jpeg(file_reader, channels = 3,
                                    name='jpeg_reader')
float_caster = tf.cast(image_reader, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0);
resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
sess = tf.Session()
result = sess.run(normalized)

我將逐行為您的張量流代碼編寫OpenCV代碼:

file_name = 'image path'
input_name = 'file_reader'
input_height=299
input_width=299
input_mean=0
input_std=255

#file_reader = tf.read_file(file_name, input_name)
#image_reader = tf.image.decode_jpeg(file_reader, channels = 3,name='jpeg_reader')                              
image = cv2.imread(file_name, -1)


#float_caster = tf.cast(image_reader, tf.float32)
float_caster = image.astype(numpy.float32, copy=False)


#dims_expander = tf.expand_dims(float_caster, 0);
#This line just adds another dimension to the image, which is not needed for OpenCV but if you want:
#dims_expander = numpy.expand_dims(float_caster, axis=0)


#resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
resized = cv2.resize(float_caster, (input_height,input_width),interpolation=cv2.INTER_LINEAR)

#normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
normalized = resized - input_mean
normalized /= input_std

請記住,OpenCV將圖像讀取為BGR而tensorflow將圖像讀取為RGB 因此,如果要直觀地比較結果,則需要將一個轉換為另一個的順序。

tf.image.resize_bilinear是越野車功能。 因此,在TF和CV2中調整相同圖像的大小后,您將不會獲得完全相同的值。

快速示例:

img_original = np.random.randint(0, 255, (4,4,3)).astype(np.uint8)
img_rescaled = cv2.resize(img_original, (3,3), cv2.INTER_LINEAR)
print(img_original)

array([[[144,   9, 253],
    [  5,  87,   5],
    [ 21, 125, 117],
    [109, 159, 142]],

   [[ 64, 124, 196],
    [ 43, 230,  80],
    [ 42, 166,  36],
    [158, 121,  11]],

   [[238, 234,  57],
    [ 86, 254, 239],
    [149, 133, 161],
    [ 96, 245,  99]],

   [[128,   7, 134],
    [169,  69,  70],
    [246,  31,  95],
    [143,   1,  58]]], dtype=uint8)

檢查數組如何通過CV2轉換:

print(img_rescaled)

array([[[111,  42, 206],
    [ 18, 121,  60],
    [102, 149, 117]],

   [[137, 189, 132],
    [ 80, 196, 129],
    [122, 177,  62]],

   [[148,  54, 117],
    [192,  74, 102],
    [151,  42,  71]]], dtype=uint8)

現在,讓我們定義TF會話,看看幕后發生了什么:

x = tf.placeholder(tf.uint8, shape=(None,4,4,3), name='x')
resize_op_TF = tf.image.resize_bilinear(x, (3,3), name='resize_op')
session = tf.InteractiveSession()
img_resized_TF = session.run(resize_op_TF, {x: [img_original]})[0]
print(img_resized_TF)

array([[[144.      ,   9.      , 253.      ],
    [ 10.333334,  99.66667 ,  42.333336],
    [ 79.66667 , 147.66667 , 133.66667 ]],

   [[122.00001 , 160.66667 , 149.66666 ],
    [ 64.111115, 210.33333 , 114.55556 ],
    [117.44445 , 159.88889 ,  52.77778 ]],

   [[164.66666 ,  82.66664 , 108.33334 ],
    [165.44446 , 108.777756, 123.22222 ],
    [156.11111 ,  76.55554 ,  86.77777 ]]], dtype=float32)

如您所見,使用TF重新縮放的數組中的值和使用CV2重新縮放的數組中的值完全不同。 這是Tensorflow中的常見問題,由於種種原因,開發人員仍未修復它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM