[...] 我听说在处理图像时必须从不使用.astype(x)。
这在很大程度上取决于使用的库和用例!在这个非常具体的示例中,首先使用 img_as_float32 而不是 .astype(np.float32) 会导致观察到的行为!
查看cv2.bilateralFilter 上的文档,我们看到有一个参数sigmaColor,您将其设置为20,用于np.uint8 和np.float32 图像。但是,sigmaColor = 20 仅适用于此处的np.uint8 情况,因为它的值在[0 ... 255] 的范围内。另一方面,您的np.float32 图像的值在[0.0 ... 1.0] 范围内,这解释了严重的模糊。
因此,有两个选项可以解决这个问题,都涉及手动缩放:
- 在开头使用
.astype(np.float32)。然后,您可以使用sigmaColor = 20,但生成的图像将具有0.0 ... 255.0 范围内的值,因此您需要除以255,例如在使用 matplotlib 进行绘图之前。
import cv2
import matplotlib.pyplot as plt
import numpy as np
from skimage import img_as_float32, img_as_ubyte
# Use .astype(x) instead of img_as_x
img = cv2.imread('path/to/your/image.jpg')[..., ::-1]
filter_uint8 = cv2.bilateralFilter(img, 200, 200, 200)
filter_float32 = cv2.bilateralFilter(img.astype(np.float32), 200, 200, 200)
plt.figure(1, figsize=(14, 8))
plt.subplot(2, 2, 1), plt.imshow(img), plt.title('Original image')
plt.subplot(2, 2, 2), plt.imshow(filter_uint8), plt.title('uint8 filtered')
plt.subplot(2, 2, 3), plt.imshow(filter_float32), plt.title('float32 filtered')
plt.subplot(2, 2, 4), plt.imshow(filter_float32 / 255), plt.title('float32 filtered, corrected')
plt.tight_layout()
- 在
cv2.bilateralFilter 调用中将sigmaColor 除以255。因此,您的结果将直接具有0.0 ... 1.0 范围内的值:
import cv2
import matplotlib.pyplot as plt
from skimage import img_as_float32, img_as_ubyte
# Scale sigmaColor w.r.t. to float value range of [0.0 ... 1.0]
img = img_as_float32(cv2.imread('path/to/your/image.jpg')[..., ::-1])
filter_uint8 = cv2.bilateralFilter(img_as_ubyte(img), 200, 200, 200)
filter_float32 = cv2.bilateralFilter(img, 200, 200, 200)
filter_float32_corr = cv2.bilateralFilter(img, 200, 200/255, 200)
plt.figure(0, figsize=(14, 8))
plt.subplot(2, 2, 1), plt.imshow(img), plt.title('Original image')
plt.subplot(2, 2, 2), plt.imshow(filter_uint8), plt.title('uint8 filtered')
plt.subplot(2, 2, 3), plt.imshow(filter_float32), plt.title('float32 filtered')
plt.subplot(2, 2, 4), plt.imshow(filter_float32_corr), plt.title('float32 filtered, corrected')
plt.tight_layout(), plt.show()
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
Matplotlib: 3.4.0
NumPy: 1.20.2
OpenCV: 4.5.1
scikit-image: 0.18.1
----------------------------------------