tensorflow和opencv在形态学操作上的区别

本文探讨了在深度学习库TensorFlow(tf.nn.erosion2d和tf.nn.dilation2d)与图像处理库OpenCV(cv2.erode和cv2.dilate)中进行形态学操作的区别。通过实验比较,展示了使用这两套API处理同一原图后的不同输出效果。

tensorflow和cv2在形态学操作上的区别


tf.nn.erosion2d、tf.nn.dilation2d和cv2.erode,cv2.dilate的区别:

1.结果的区别:
实验:
原图片:(来自西工大NWPU-RESISC45数据集)
在这里插入图片描述
用tf.nn.erosion2d的代码

import tensorflow as tf
import skimage.io as io
import keras.backend as K
import numpy as np
from matplotlib import pyplot as plt

kernel = K.random_normal(shape = (3, 3, 1))
img = io.imread('./airplane.png')
img = tf.convert_to_tensor(img ,tf.float32) #将array转化为tensor
img = tf.expand_dims(img, 0)                #升维度
img = tf.expand_dims(img, 3)

img1 = tf.nn.erosion2d(img, kernel, strides = [1,1,1,1], rates = [1,1,1,1], padding = "SAME")#图像腐蚀

with tf.Session() as sess:
    imgout = sess.run(img1)
    print(sess.run(img))
    print('-----')
    print(sess.run(img1))

imgout = imgout.squeeze(axis=0) #降维度
imgout = imgout.squeeze(axis=2)

plt.imshow(imgout)
plt.show()
plt.close()
结果(截取了一部分)[[[[147.]
   [153.]
   [147.]
   ...
   [147.]
   [153.]
   [147.]]
   ...
   [ 51.]
   [ 96.]
   [ 51.]]]]
-----
[[[[145.54266 ]
   [117.63092 ]
   [115.54267 ]
   ...
   [ 49.86652 ]
   [ 49.99149 ]
   [ 50.790764]]]]

输出图片:
在这里插入图片描述

用cv2.erode的代码:

from matplotlib import pyplot as plt
import skimage.io as io
import numpy as np
import cv2

img = io.imread('./airplane.png')
kernel = np.random.normal(loc = 0, scale = 1, size = (3, 3))
img1 = cv2.erode(img, kernel)
print(img)
print('-----')
print(img1)

plt.imshow(img1)
plt.show()
plt.close()
输出结果:
[[147 153 147 ... 147 153 147]
 [147 153 117 ... 147 123 153]
 [153 147 153 ... 153 147 137]
 ...
 [147 123 147 ...  96  51  96]
 [102 102 147 ...  80  51  96]
 [102 147 102 ...  51  96  51]]
-----
[[147 117 117 ... 123 123 123]
 [147 117 117 ... 123 123 123]
 [147 117 117 ... 123 107 107]
 ...
 [102 102 102 ...  51  51  51]
 [102 102 102 ...  51  51  51]
 [102 102 102 ...  51  51  51]]

输出图片:
在这里插入图片描述


图片看起来几乎一样,但是数据不是一样的。tf.nn.erosion2d只接受浮点数值的tensor,返回是浮点数据。而cv2.erode返回的是整数数据。在形态学膨胀上也如此。
2.参数区别:
tf.nn.erosion2d(
    value,
    kernel,
    strides,
    rates,
    padding,
    name=None
)

tf.nn.dilation2d(
    input,
    filter,
    strides,
    rates,
    padding,
    name=None
)

cv2.erode(src, kernel, dst=None, anchor=None,
	iterations=None, borderType=None, borderValue=None)
	
cv2.dilate(src, kernel, dst=None, anchor=None, 
	iterations=None, borderType=None, borderValue=None)

后续内容请关注CSDN本专栏
更多内容请关注公众号
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故事已经翻了几页

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值